Java8 本身也提供了一些函数式编程的思想接口,将整个代码的结构和思想向着函数式编程的范式去演进。
Consumer
Consumer 接口接收一个参数。对参数做一系列操作,不存在返回值。
在流式处理中,其意义就是类似 foreach 可以直接处理
Consumer<String> printLength = s -> System.out.println(s.length());
Arrays.asList("Hello", "World").forEach(printLength);
如果希望直接调用,可以直接使用 accept 逻辑完成 , 流操作的另一个逻辑就是 andThen
Arrays.asList("Hello", "Consumer").forEach(
printLength.andThen(s -> System.out.println(s.isEmpty()))
);
Supplier
对比于 Consumer 接口, Supplier 接口是一个供给型的接口
Supplier 接口可以当做一个功能提供的角色, 还可以完成延迟初始化或者类似随机数生成器
Supplier<Integer> randomInt = () -> ThreadLocalRandom.current().nextInt();
System.out.println(randomInt.get());
Supplier 不存在消费任何参数的性质,所以起没有andThen操作,只有一个 get逻辑
Predicate
Predicate 接口是一个谓词性接口,接收一个参数,返回一个布尔值。
可以将其使用在条件判断的位置上完成。
// predicate
Predicate<Integer> greaterThanTen = num -> num > 10;
Stream.of(1,5,10,15)
.filter(greaterThanTen)
.collect(Collectors.toList());
可以看到 filter 的参数都是 Predicate 函数式接口
Function
上述接口一般都是存在固定场景,最后加一个通用的Function接口 , 即完成函数的通用功能 - 转换; 将输入的数据转换为输出的数据。
// function
Function<Integer, Integer> square = n -> n * n;
Stream.of(1, 2, 3, 4, 5).map(square).forEach(System.out::println);
可以看到 map 里面的参数都是 Function 类型的接口数据
BIFunction
下面介绍一个比较少见的,但是必要情况可以使用一下
BIFunction 表示接收两个参数,返回一个结果的情况。
BiFunction<Integer, Integer, Integer> add = Integer::sum;
System.out.println(add.apply(1, 1));
Runnable
如果希望延时计算,没有任何参数和返回任何的参数,可以使用这个
比如不希望重复写 try-catch 逻辑
private void safeExecute(Runnable closeFunc) {
try {
closeFunc.run();
} catch (Exception | Error e) {
FineLoggerFactory.getLogger().error("execute fail", e);
}
}
细节可以继续查看: package java.util.function;
- 复习 Java函数式编程 (@2023-12-14)