Java Метод уменьшения потока - PullRequest
1 голос
/ 27 марта 2020

Что на самом деле делает метод сокращения? Я прочитал Oracle документы, но я все еще не понимаю, что делает метод сокращения здесь в этом примере

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;
}

Ответы [ 2 ]

5 голосов
/ 27 марта 2020

Посмотрите документацию :

Опциональное уменьшение (аккумулятор BinaryOperator)

Выполняет сокращение элементов этого потока, используя ассоциативная функция накопления и возвращает необязательный параметр, описывающий уменьшенное значение, если оно есть.

Это означает, что reduce принимает BinaryOperator<T> - специфицирующую c функцию, которая принимает два параметра типа T и производит тот же тип.

В вашем потоке может быть любое количество Coder экземпляров, функция сокращения берет два Coder с и возвращает второй. Это означает, что из всего потока возвращается Coder, завернутый в Optional, если он есть, и пустой Optional, если поток был пустым.

Обратите внимание, что это может быть написано более эффективно:

coders.stream()
    .max(Comparator.comparing(BMICalculator::calculateBMI))
    .orElse(null);
0 голосов
/ 28 марта 2020
.reduce((first, second) -> second).orElse(null);

метод Reduce будет выполнен, если присутствуют первое и второе значения, иначе orElse (null), который принимает значение null, вернет значение null.

...