函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可
以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导
Function<T, R>
T:入参类型,R:出参类型
调用方法:R apply(T t);
定义函数示例:Function<Integer, Integer> func = p -> p * 10; // 输出入参的10倍
调用函数示例:func.apply(10); // 结果100
Consumer<T>
T:入参类型;没有出参
调用方法:void accept(T t);
定义函数示例:Consumer<String> consumer= p -> System.out.println(p); // 因为没有出参,常用于打印、发送短信等消费动作
调用函数示例:consumer.accept("18800008888");
Supplier<T>
T:出参类型;没有入参
调用方法:T get();
定义函数示例:Supplier<Integer> supplier= () -> 100; // 常用于业务“有条件运行”时,符合条件再调用获取结果的应用场景;运行结果须提前定义,但不运行。
调用函数示例:supplier.get();
Predicate<T>
T:入参类型;出参类型是Boolean
调用方法:boolean test(T t);
定义函数示例:Predicate<Integer> predicate = p -> p % 2 == 0; // 判断是否、是不是偶数
调用函数示例:predicate.test(100); // 运行结果true
**4种函数式接口使用场景个人总结:
Supplier(生产者) :他的泛型一定和方法的返回值类型是一种类型
如果需要获得一个数据,并且不需要传入参数,可以使用Supplier接口.
Consumer(消费者):如果想要处理一个数据,但是不需要返回值,可以使用Consumer接口
predicate(判断):如果想要判断一个数据,并且需要一个布尔类型的返回值,可以使用predicate接口.
Function(函数):如果想要进行属性之间的转换,如String->Integer,则需要使用Function接口,
Function的泛型一般有两种类型,前面的类型表示传入的参数类型,后面的类型表示返回值类型.**
在调用时直接可以将这几个函数式对象作为参数传入方法:
例如:
public void testSupplier(Supplier<List<User>> uselSuuplier){
List<User> users = uselSuuplier).get();
}
调用的时候为testSupplier(()->getUserList())
public void testFunc(Function<Integer, Integer> func){
Integer change = .......(自己获取逻辑)
if(){
....
}else{
Integer result = func.apply()
}
//只有在else的情况下才去执行changeResult(p)方法
}
调用的时候为testFunc((p)->changeResult(p))
这种方式的好处在于,方法中不用关心上层调用者的逻辑,由上层调用者自己实现,代码调用的时候在下层才去实现