函数式接口:有且仅有一个抽象方法的接口(允许有其他的方法)
@FunctionalInterface 用来标记一个函数式接口
函数式接口的使用:一般结合Lambda表达式使用
使用Lambda表达式的前提,就你是必须要有一个函数式接口。使用场景有下面两种
1. 函数式接口作为方法的参数使用
调用这个方法时,可以传递Lambda表达式。
new Thread(()->{....}).start();
2. 函数式接口作为方法的返回值类型
方法实际返回的,可以是Lambda表达式。
public Comparator<String> getComparator(){
//返回Lambda表达式
return (String o1,String o2)->{return o1.compareTo(o2);}
}
总结:不管函数式接口作为参数还是返回值,都可以让Lambda表达式作为接口的实例。
函数式接口的实际运用
在API中已经定义好了很多个函数式接口,也有很多方法在使用函数式接口作为参数。
所以我们更重要关注的是,调用方法时传递Lambda表达式即可.
Lambda的格式的几种写法
1. 标准写法
(Type1 param1,Type2 param2)->{ return 语句体... ;};
2. 省略数据类型
(param1,param2)->{ return 语句体... ;};
3. {}的语句体只有一条语句的时候,省略{}、return
(param1,param2)->语句体;
4. 参数只有一个的情况,()可以省略
param->语句体;
API中常用的函数式接口
Supplier<T> 是一个生产型接口,有一个T get()可以返回一个想要的数据。
Consumer<T> 是一个消费型接口,
有一个accept(T t)可以消费一个指定类型的数据。
有一个 Consumer<T> andThen(Consumer<T> con) 用于连接一个Consumer接口,进行连续消费。
Predicat<T>接口 是一个判断型接口
有一个boolean test(T t) 可以用于对指定的数据进行校验得到boolean类型的结果
Predicat<T> and(Predicat<T> pre) 可以用于连接两个条件,进行&&运算
Function<R,T> 是一个转换型接口
有一个T apply(R r) 可以用来把一个类型的数据转换为另一个类型的数据
有一个Function<T,W> andThen(Function<T,W> fun)
总结:
1. 函数式接口:有且仅有一个抽象方法的接口(允许有其他方法)
2. 函数式接口的使用
1) 作为方法的参数使用:实际参数传递Lambda表达式
2) 作为方法的返回值使用:实际返回传递Lambda表达式
3. 常用的函数式接口
Supplier<T> 生产型接口
T get() 可以获取一个想要的T类型的数据
Consumer<T> 消费型接口
void accept(T t) 用于消费一个T类型的数据
Consumer<T> andThen(Consumer<T> con) 用于连接两个Consumer<T>接口进行连续消费
Predicate<T> 判断型接口
boolean test(T t) 用于校验T类型的数据是否符合条件
Predicate<T> and(Predicate<T> pre) 用于连接两个Predicate<T>接口进行连续校验(类似于&&运算,两个条件都得满足)
Predicate<T> or(Predicate<T> pre) 用于连接两个Predicate<T>接口进行连续校验(类似于||运算,只一个条件即可)
Predicate<T> negate() 对test()校验的结果取反
Function<T,R> 转换型接口
R apply(T t) 把T类型的数据转换为R类型的数据
Function<R,W> andThen(Function<R,W> fun) 用于连接两个Function<R,W>接口进行连续消费
第一次转换:把T类型转换为R类型
第二次转换:把R类型转换为W类型