Categorías
Java 8 Stream

Reducir ejemplos de transmisión

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.

  Convertir flujo a matriz en Java 8

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. Podemos evitar el tipo opcional, dándole un valor inicial 0:

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 ()

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *