Java Lambda reduce es una de las operaciones más utilizadas cuanto trabajamos con colecciones de objetos y expresiones lambda. Reduce sirve para convertir un Array de elementos en un único elemento y se usa por ejemplo para calcular la suma de n términos. Veamos un ejemplo sin expresiones lambda:
package com.arquitecturajava; import java.util.ArrayList; import java.util.List; public class Principal { public static void main(String[] args) { List<Integer> lista= new ArrayList<Integer>(); lista.add(5); lista.add(2); lista.add(7); lista.add(9); int total=0; for (int numero:lista) { total+=numero; } System.out.println(total); } }
El resultado por pantalla será :
Java Lambda reduce
Es fácil convertir esto al mundo de los Streams y las expresiones lambda utilizando Java Lambda reduce para que sea esa función la que sume.
package com.arquitecturajava; import java.util.stream.IntStream; public class Principal2 { public static void main (String args[]) { int resultado=IntStream.of(5,2,7,9).reduce(0,(x,y)->x+y); System.out.println(resultado); } }
El código se reduce de forma clara , la realidad es que este tipo de operaciones las tenemos que hacer continuamente. La nueva forma de operar con Streams y Lambda lo simplifica mucho .¿Podemos mejorar un poco el código?. Si en vez de crear nosotros nuestra propia expresión lambda podemos usar un reference method y apuntar a la clase wrapper(Integer) que será la encargada de realizar la suma apoyándonos en el método sum.
package com.arquitecturajava; import java.util.stream.IntStream; public class Principal3 { public static void main (String args[]) { int resultado=IntStream.of(5,2,7,9).reduce(0,Integer::sum); System.out.println(resultado); } }
De esta forma evitaremos errores. La clase Integer acaba de añadir nuevos métodos en Java 8 para que puedan ser utilizados por las expresiones lambda , sum es uno de ellos.
otros artículos relacionados: Expresiones Lambda , JavaScript Reduce , Java Lambda Workflow
[…] artículos relacionados: Java Lambda , Java Lambda Reduce ,Java Lambda […]
Buen artículo. Lo único que no me gusta de Lambdas es que cuando trabajas con colecciones de objetos, se tiene que romper el encapsulamiento. Por ejemplo, si tengo una colección de objetos User y quiero hace un filtrado por fecha de nacimiento:
http://pastebin.com/wgBzTvh3
El compilador te dirá que la propiedad “birthDate” tiene un acceso privado, lo que te forzará a hacer la propiedad public, protected o default.
¿Por qué en vez de intentar acceder al atributo del objeto no utilizas el getter correspondiente?