Jdk8 新增一个重要的包:java.util.function
。该包下所有的接口都是函数式接口:@FunctionalInterface
。
主要分为四大类:Supplier
、Consumer
、Predicate
、Function
。
接口 | 方法 | 参数 | 返回值 | 说明 |
---|---|---|---|---|
Supplier |
T get(); | 无 | T | 供给型;无参,返回一个指定泛型的对象 |
Consumer |
void accept(T t); | T | 无 | 消费型;传入一个指定泛型的参数,无返回值 |
Predicate |
boolean test(T t); | T | Boolean | 断言型:输入一个参数,返回判断结果 |
Function<T, R> | R apply(T t); | T | R | 方法型;输入一个参数,得到一个结果 |
如果T/R
为int/long/double
,该包下定义了相关接口,如IntSupplier
、IntConsumer
、IntFunction
、IntPredicate
……
针对参数扩展延伸:
接口 | 方法/继承关系 | 说明 |
---|---|---|
BiConsumer<T, U> | void accept(T t, U u); | 接收T对象和U对象,不返回值 |
BiPredicate<T, U> | boolean test(T t, U u); | 接收T对象和U对象,返回Boolean |
BiFunction<T, U, R> | R apply(T t, U u); | 接收T对象和U对象,返回R对象 |
BinaryOperator |
extends BiFunction<T,T,T>; 即 T apply(T t, T u); |
接收两个T对象,返回T对象 |
UnaryOperator |
extends Function<T, T> 即 T apply(T t); |
接收T对象,返回T对象 |
一、Supplier
1、源码
1 |
|
2、使用
1 | public void supplierExample() { |
3、在JDK8 中常见用处
如: Optional 对象的 orElseGet
和 orElseThrow
方法
1 | User user = null; // |
二、Consumer
1、源码
1 |
|
2、使用
1 | public void consumerExample() { |
3、在JDK8 中常见用处
如 Iterator 的forEach
方法,Stream 的forEach
方法:
1 | List<User> userList = new ArrayList<>(); // |
三、Predicate
1、源码
1 |
|
2、使用
1 | public static void predicateExample() { |
3、在JDK8 中常见用处
如:如 Stream 的 filter
方法需要的参数就是 Predicate 接口
1 | IntStream.of(1, 2, 3, 4, 5, 6) |
四、Function<T, R>
1、源码
1 |
|
2、使用
1 | public static void functionExample() { |
3、在JDK8 中常见用处
如 HashMap的 computeIfAbsent
1 | Map<Integer, User> map = new HashMap<>(); |
如 Stream 的 map
转换流
1 | List<User> userList=new ArrayList<>(); |