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<>(); |