Reduce en Java Stream con Ejemplos

java-stream

java-stream


En esta nueva entrada abordaremos y mostraremos Reduce en Java Stream con Ejemplos.

El API de Java Stream nos proporciona diferentes funciones funcionales para poder trabajar con Streams en Java. Una de esas funciones es Reduce, la cual nos permite obtener un único resultado partiendo de un stream.

Antes de empezar con los ejemplos vamos a ver unos conceptos básicos:

Conceptos de Java Stream Reduce

Para poder conseguir nuestro resultado único final, vamos a hacer uso de los siguientes elementos:

  • Identidad (Identity): Es el valor inicial del proceso de convertir a un único valor, o si no hay más valores, el valor final.
  • Acumulador (Accumulator): Es el encargado de procesar los valores y acumular el resultado.
  • Combinador (Combiner): El combinador es usado para combinar el resultado parcial obtenido cuando la reducción es paralelizada.

Ahora que tenemos las cosas algo más claras vayamos con algunos ejemplos:

Stream Reduce en Java

La mejor manera de entender Reduce y los conceptos anteriores es verlos con ejemplos, para ello vamos a sumar una lista de números.

List<Integer> numbers = List.of(1,2,3,4,5,6,7,8);

int number = numbers.stream()
        .reduce(0, (acumulator, element)-> acumulator + element);

System.out.println("El total es: "+ number);

Resultado:

El total es: 36

En el ejemplo anterior podemos ver el uso de indentity y acumulator, el primero sería el valor del que partimos, en este caso Identity es 0, y el segundo va almacenando los resultados parciales, que en este caso lo hemos llamado acumulator.

A continuación vamos a ver un ejemplo de Reduce con String, en el siguiente ejemplo vamos a devolver un String en el que se concatenen únicamente la letra ‘A’.

    List<String> letters = List.of("A","B","C","D","A","E","A");

    letters.stream()
        .reduce("", (acumulator, element)-> {
          if (element.equalsIgnoreCase("A")) {
            return acumulator+element;
          }
          return acumulator;
        });

System.out.println("Las letras son:  "+ letters);

El resultado es:

Las letras son: AAA

Podemos ver como el trantamiento con String e Integer es bastante similar, en este último hemos añadido algo más de complejidad añadiendo un If dentro de la función reduce.

Uso de Combiner en Stream Reduce

Vayamos ahora a ver el uso con Combiner, como hemos comentado antes, este elemento es usado cuando la función Reduce hace uso de parallelStream, aunque también podría ser usado con Stream como función auxiliar o adicional al proceso, aunque en esta entrada nos centraremos en ParallelStream.

Cuando usamos parallelStream en Streams de Java, lo que estamos haciendo es procesar pequeños streams, que luego habrá que juntar, es por ello, que hacemos uso de Combiner. Hay que tener en cuenta que parallelStream es recomendable cuando tenemos grandes cantidades de datos, si el Stream no es muy grande la performance puede empeorar.

List<Car> cars = Arrays.asList(new Car("Mustang", 10), new Car("Megane", 35), new Car("Toledo", 21);

int number = cars.stream()
  .reduce(0, (partialResult, car) -> partialResult + car.getAge(), Integer::sum);

System.out.println("El total es: "+ number); //67

Conclusión

En esta entrada hemos visto un uso más que nos proporciona la API de Stream de java para poder procesar información y obtener un resultado único, mediante el uso de Reduce. Si quieres ver otras entradas en el que se hace uso de Streams de Java puedes echar un ojo aquí.

No te olvides de seguirnos en nuestras redes sociales Facebook o Twitter para estar actualizado.


Deja una respuesta

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