Java Stream Reduce 方法

cod*_*er3 1 java functional-programming list java-8 java-stream

reduce 方法在这里实际做什么?我已经阅读了 Oracle 文档,但我仍然不明白这个例子中的 reduce 方法在做什么

public static Coder findCoderWithWorstBMI(List<Coder> coders) {
    return coders.stream().sorted(Comparator.comparing(BMICalculator::calculateBMI))
            .reduce((first, second) -> second).orElse(null);
}

private static double calculateBMI(Coder coder) {
    double height = coder.getHeight();
    double weight = coder.getWeight();
    if (height == 0.0)
        throw new ArithmeticException();
    double bmi = weight / (height * height);
    return Math.round(bmi * 100) / 100.0;
}
Run Code Online (Sandbox Code Playgroud)

And*_*cus 5

看看文档

可选的减少?(BinaryOperator 累加器)

使用关联累积函数对此流的元素执行缩减,并返回描述缩减值的 Optional(如果有)。

这意味着reduce需要一个BinaryOperator<T>- 一个特定的函数,它需要两个类型的参数T并产生一个具有相同类型的参数。

您的流可能有任意数量的Coder实例,reduce 函数需要两个Coders 并返回第二个。这意味着,如果有任何内容,则从整个流CoderOptional返回最后一个包裹的内容,Optional如果该流最初是空的,则返回空内容。

请注意,这可以更有效地编写:

coders.stream()
    .max(Comparator.comparing(BMICalculator::calculateBMI))
    .orElse(null);
Run Code Online (Sandbox Code Playgroud)