Оказывается, что свертки вполне достаточно для вычисления максимума и минимума! Посмотрим, как применить наши только что полученные знания об операции reduce для вычисления максимального и минимального элементов потока. Как вы видели, метод reduce принимает на входе два параметра:
• начальное значение;
• лямбда-выражение, которое группирует два элемента потока данных и формирует новое значение.
Это лямбда-выражение применяется пошагово к каждому из элементов потока данных, как показано на рис. 5.7 для случая оператора сложения. Теперь же нам требуется лямбда-выражение, которое бы возвращало максимальный из двух заданных элементов. Операция reduce затем вычисляет максимальное значение между этим и следующим элементом потока, и так до тех пор, пока не будет прочитан весь поток! Для вычисления максимального элемента потока операцию reduce можно использовать, как проиллюстрировано на рис. 5.8.
Optional max = numbers.stream().reduce(Integer::max);
Для вычисления минимума достаточно передать операции reduce Integer.min вместо Integer.max:
Optional min = numbers.stream().reduce(Integer::min);
Можно было воспользоваться и лямбда-выражением (x, y) -> x < y ? x : y вместо Integer::min, но последнее намного более удобочитаемо!