Java8新特性【函数式接口】
一、什么是函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
如定义了一个函数式接口如下:
@FunctionalInterface
interface GreetingService {
void sayMessage(String message);
}
那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA8 之前一般是用匿名类实现的):
GreetingService greetService1 = message -> {System.out.println("Hello " + message);};
在Java8之前,常见的函数式接口有:
java.lang.Runnable
java.util.concurrent.Callable
java.util.Comparator
java.lang.reflect.InvocationHandler
二、Java8内置的四大函数式接口
在学习一段时间后会不会有这样的疑问:
难道我要用Lambda表达式的时候总要自己写函数式接口吗?
当然不是这样了,Java8里面提供了四大核心的函数式接口供我们使用,在符合业务要求的场景下,我们可以直接拿来使用。
函数式接口 | 参数类型 | 返回类型 | 用途 |
---|---|---|---|
Consumer |
T | void | 对类型为 T 的对象应用操作,包含方法: void accept(T t); |
Supplier |
无 | T | 返回类型为 T 的对象,包含方法:T get(); |
Function<T,R> 函数型接口 | T | R | 对类型为 T 的对象应用操作,并返回结果。结果是 R 类型的对象。包含方法: R apply(T t); |
Predicate |
T | boolean | 确定类型为 T 的对象是否满足某约束,并返回 boolean 值。包含方法: boolean test(T t); |
案例代码如下:
/**
* @name 消费型接口
* @use Consumer<T>
* @param T 传入参数
* @fun 接受一个参数 无返回值
* */
Consumer<String> con=(str)->System.out.println(str);
con.accept("我是消费型接口!");
/**
* @name 供给型接口
* @use Supplier<R>
* @param R 返回值类型
* @fun 无参数 有返回值
* */
// Supplier<Date> supp=()-> {return new Date();};
// 上面那一行代码可以修改为如下
Supplier<Date> supp=()-> new Date();
Date date=supp.get();
System.out.println("当前时间:"+date);
/**
* @name 函数型接口
* @use Function<T,R>
* @param T 传入参数
* @return R 返回值类型
* @fun 接受一个参数 有返回值
* */
// Function<String, String> fun=str->{return "hello,"+str;};
// 上面那一行代码可以修改为如下
Function<String, String> fun=str->"hello,"+str;
String str=fun.apply("跑调大叔!");
System.out.println(str);
/**
* @name 断定型接口
* @use Predicate<T>
* @param T 传入参数
* @return Boolean 返回一个Boolean型值
* @fun 接受一个参数 返回Boolean型值
* */
// Predicate<Integer> pre=num->{return num>0;};
// 上面那一行代码可以修改为如下
Predicate<Integer> pre=(num)->num>0;
Boolean flag=pre.test(10);
System.out.println(flag);
三、拓展函数式接口
如果觉得这四个内置的函数式接口还是不够用,那么可以参考下面的一些拓展的接口,其用法与上面大同小异:
https://www.runoob.com/java/java8-functional-interfaces.html
Java新手,若有错误,欢迎指正!