La API de Java 8 Stream contiene un conjunto de operaciones de terminal (como promedio, suma, mínimo, máximo y recuento) que devuelven un valor al combinar los elementos de un flujo. Estas operaciones de terminal se denominan operaciones de reducción. Además de esas operaciones de terminal, el JDK también proporciona el método de reducción de propósito general: reduce()
, que describe esta publicación.
1. Un ejemplo simple de Stream.reduce ()
Suponiendo que tengamos un flujo de palabras como el siguiente:
List<String> list = new ArrayList<String>(); list.add("java"); list.add("php"); list.add("python"); list.add("perl"); list.add("c"); list.add("lisp"); list.add("c#"); Stream<String> wordStream = list.stream(); |
Podemos usar el siguiente código para obtener la suma de la longitud de las cadenas en la lista:
int s = wordStream.map(s -> s.length()) .mapToInt(Integer::new) .sum(); System.out.println(s); |
También podemos usar el método Stream.reduce (), que es un método más general:
Stream<Integer> lengthStream = wordStream.map(s -> s.length()); Optional<Integer> sum = lengthStream.reduce((x, y) -> x + y); sum.ifPresent(System.out::println); |
Stream.reduce () toma la entrada como una función acumuladora que toma dos parámetros: un resultado parcial de la reducción (en este caso, la suma de todos los enteros procesados hasta ahora) y el siguiente elemento del flujo (en este caso, un entero ). Devuelve un nuevo resultado parcial. En este caso, la función de acumulador es una expresión lambda que suma dos valores enteros y devuelve un valor entero.
En lugar de usar la expresión lambda, también puede usar:
Optional<Integer> sum = lengthStream.reduce(Integer::sum); |
2. Proporcionar valor de identificación
En el ejemplo anterior, el método reduce () devuelve un Opcional
Stream<Integer> lengthStream = wordStream.map(s -> s.length()); int sum = lengthStream.reduce(0, (x, y) -> x + y); System.out.println(sum); |
El valor inicial debe ser un valor para la función de reducción. Para todo t, reduce (identidad, t) y reduce
Además, también podemos escribir el método reduce () como el siguiente:
int s = wordStream.reduce(0, (x, y) -> x + y.length(), (x, y) -> x + y); System.out.println(s); |
Los tres parámetros son identificador, reductor y combinador.
– identidad – valor de identidad para la función de combinación
– reductor – función para combinar dos resultados
– combinador – función para agregar un elemento adicional a un resultado.
Referencia:
1. Stream.reduce ()