归约函数(Reducing Function)是指一种将多个值组合成单个值的函数。在计算中,归约函数通常用于将一个集合或流中的元素聚合成一个结果。
Java 8 引入了 reduce
方法来执行集合的归约操作。reduce
方法接受一个归约函数作为参数,并将其应用于流中的元素来生成一个结果。在 reduce
方法中,归约函数接受两个参数:累加器(初始值或者上一次归约操作的结果)和当前元素,并返回一个新的累加器的值。
以下是 reduce
方法的示例签名:
Optional reduce(BinaryOperator accumulator)
//这里的identity其实是一个默认值,用于保证返回值不为空Stream所以返回值都不需要用Optional接受了
T reduce(T identity, BinaryOperator accumulator)
以及它的使用举例:
List numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional sumOptional = numbers.stream().reduce((a, b) -> a + b);
int sum = sumOptional.orElse(0); // 结果为 15
用法很简单,这里主要讲一讲函数式接口BinaryOperator
翻一下源码我们发现:
@FunctionalInterface
public interface BinaryOperator extends BiFunction {
BinaryOperator继承自BiFunction
它其实就是BiFunction的简化版,我们看看BiFunction源码
@FunctionalInterface
public interface BiFunction {
看到没有人家是三种不同的泛型,简单来说就是输入前两种泛型的值,一顿骚操作 返回第三种泛型的值,那么问题来了具体的骚操作是啥呢?上代码:
static void demoFunction1(BiFunction biFunction) {
Long sum = biFunction.apply("1", 2);
System.out.println("计算值sum:" + sum);
}
public static void main(String[] args) {
//演示调用demoFunction1方法
demoFunction1((a, b) -> {
System.out.println("参数a:" + a);
System.out.println("参数b:" + b);
return Long.valueOf(a) + Long.valueOf(b);
});
}
//控制台输出结果:
参数a:1
参数b:2
计算值sum:3
理解了BiFunction 在回头看看BinaryOperator是不是更简单
扩展:
其实还有类似的函数式
BiConsumer其相当于BiFunction没有指定的返回值类型也没有返回值 调用accept方法触发逻辑
List numbers = Arrays.asList(1, 2, 3, 4, 5);
BiConsumer printSum = (a, b) -> System.out.println("Sum: " + (a + b));
numbers.forEach(n -> printSum.accept(n, n+1));
// 输出:
// Sum: 2
// Sum: 4
// Sum: 6
// Sum: 8
// Sum: 10
BiPredicate