Метод reduce
Метод reduce выполняет свёртку элементов потока в один результат.
Он последовательно применяет переданную функцию к элементам потока,
накапливая промежуточное значение. Метод имеет три формы перегрузки.
В первой форме параметром выступает функция типа BinaryOperator,
которая принимает два значения и возвращает одно. Во второй форме
первым параметром передаётся начальное значение (identity), а вторым -
функция BinaryOperator. В третьей форме первым параметром
передаётся начальное значение, вторым - функция типа BiFunction,
а третьим - функция типа BinaryOperator для объединения
промежуточных результатов при параллельной обработке.
Синтаксис
stream.reduce(BinaryOperator<T> accumulator)
stream.reduce(T identity, BinaryOperator<T> accumulator)
stream.reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
Пример
Давайте найдём сумму всех чисел потока, используя форму метода без начального значения:
import java.util.List;
import java.util.Optional;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(1, 2, 3, 4, 5);
Optional<Integer> res = list.stream()
.reduce((a, b) -> a + b);
System.out.println(res.get());
}
}
Результат выполнения кода:
15
Пример
Давайте найдём сумму чисел, передав начальное значение
10 в качестве первого параметра:
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(1, 2, 3, 4, 5);
Integer res = list.stream()
.reduce(10, (a, b) -> a + b);
System.out.println(res);
}
}
Результат выполнения кода:
25
Пример
Давайте найдём максимальное число в потоке, используя
метод reduce без начального значения:
import java.util.List;
import java.util.Optional;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(3, 1, 5, 2, 4);
Optional<Integer> res = list.stream()
.reduce((a, b) -> a > b ? a : b);
System.out.println(res.get());
}
}
Результат выполнения кода:
5
Пример
Давайте объединим все строки потока в одну, используя начальное значение в виде пустой строки:
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("a", "b", "c", "d", "e");
String res = list.stream()
.reduce("", (a, b) -> a + b);
System.out.println(res);
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте подсчитаем количество элементов потока,
используя метод reduce с начальным значением:
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(1, 2, 3, 4, 5);
Integer res = list.stream()
.reduce(0, (count, elem) -> count + 1);
System.out.println(res);
}
}
Результат выполнения кода:
5