Cada día la programación funcional está más de moda y Java 8 tiene un buen soporte para ello .Sin embargo muchas veces no tenemos muy claro como aplicarla. Vamos a construir un ejemplo sencillo. Supongamos que tenemos una lista de gastos de viaje diarios y la empresa se hará cargo de todos ellos. Eso sí , si una vez sumado a los gastos el IVA el importe supera los 100 euros la empresa no lo pagará ya que considerará que nos hemos excedido en lo que gastamos en un día. Las operaciones que tendremos que realizar resumiendo son:
Solución Clásica
Bueno vamos a solventar este problema y para ello vamos a construir un Array de Objetos de tipo Gasto y programar la lógica necesaria para que las operaciones nos funcionen correctamente :
package com.arquitecturajava.streams; import java.util.ArrayList; public class Principal { public static void main(String[] args) { ArrayList<Gasto> lista= new ArrayList<Gasto>(); lista.add(new Gasto("A",80)); lista.add(new Gasto("B",50)); lista.add(new Gasto("C",70)); lista.add(new Gasto("D",95)); double totalPago=0; for (Gasto g:lista) { if (g.getImporte()*1.21<100) { totalPago=totalPago+ g.getImporte()*1.21; } } System.out.println(totalPago); } }
Revisando el código nos podemos dar cuenta que la lógica de negocio era bastante sencilla de aplicar . Usamos un bucle for, recorremos el array y con una estructura if que chequea si nos pasamos de 100 euros decidimos si acumulamos el importe o no el programa nos imprimirá
242.0
Hemos realizado las siguientes operaciones :
Programación y Personas
A veces los programadores nos alejamos mucho del pensamiento clásico humano que es mucho más lineal . Es decir es mas del estilo incrementamos a todos el IVA , eliminamos los gastos que pasen de 100 euros ,sumamos el resto. De ahí que aprender a programar nunca haya sido algo “facil” sino mas bien todo lo contrario ya que los conceptos son difíciles de encajar:
La programación funcional nos puede ayudar a acercarnos mas a un pensamiento humano clásico y hacer que los dos enfoques que tenemos encajen mejor.
Java y Streams
Para poder solventar el problema que tenemos de una forma más amigable vamos a usar el concepto de Java 8 Stream y programación funcional. Un Stream no es ni mas ni menos que un conjunto de funciones que se ejecutan de forma anidada.
package com.arquitecturajava.streams; import java.util.ArrayList; public class PrincipalFuncional { public static void main(String[] args) { ArrayList<Gasto> lista= new ArrayList<Gasto>(); lista.add(new Gasto("A",80)); lista.add(new Gasto("B",50)); lista.add(new Gasto("C",70)); lista.add(new Gasto("D",95)); double resultado=lista.stream() .mapToDouble(gasto->gasto.getImporte()*1.21) .filter(gasto->gasto<100) .sum(); System.out.println(resultado); } }  
Como podemos ver hemos usado en este nuevo código un stream y lo hemos dividido en tres pasos:
- Sumamos el IVA a cada uno de nuestros gastos
- Filtramos aquellos gastos que se pasan del tope
- Sumamos los que restan
De esta forma habremos resuelto nuestro problema de una forma mucho más funcional y mucho más cercana a como las personas enfocamos.
Poco a poco tenemos que irnos haciendo con este tipo de programación que nos será muy util
Hola. Los caracteres aparecen mal en esta publicacion.
Saludos
Gran aporte, ahora yo tengo una duda, en cuanto a lo que es rendimiento de una aplicación, los dos ejemplos hacen lo mismo pero se sabe si alguno ante gran cantidad de datos tendría un rendimiento mejor? Y sabes alguna herramienta con la que se pueda medir?. Yo estoy acostumbrado a usar versiones antiguas de Java donde con un bucle for y los correspondientes if/else haces de todo, quizás esto sea más legible aunque a mi me cueste más por lo que entiendo hay que adaptarse, pero si que me gustaría saber si supiera en cuanto a rendimiento teniendo en… Read more »
La programación funcional es más lenta que la clásica pero más flexible
el mismo ejemplo pero con dolares como sería?
me podrían ayudar en dolares o en pesos mexicanos?
Es en dolares americanos 🙂
[…] artículos relacionados: Java Lambda, Programación Funcional, Java 8 Streams Java Functional […]
Sencillo pero eficaz. Saludos!!
gracias 🙂
[…] artículos relacionados: Introducción a Lambda , Java Streams , Java Lambda WorkFlows , Oracle Java […]
[…] artículos relacionados : Programación Funcional, Java 8 Streams , Java 8 Lambda y forEach (II) , El concepto de Java infinite […]
[…] artículos relacionados : Java Streams , Java Lambda Java […]
[…] artículos relacionados : Java Lambda , Java Streams , Stream y […]
[…] Programación Funcional en Java: Ejemplo de programación funcional implementado en Java […]
[…] Otros artículos relacionados: Java Lambda Java Streams […]
[…] artículos relacionados: Java Lambda , Java Streams , Java Streams WorkFlows , Oracle Java […]
[…] artículos relacionados: Programación funcional y Streams , Java 8 default Methods , Java 8 […]
[…] Otros artículos relacionados: ForEach vs Iterator , Expresiones Lambda ,JavaStreams […]
[…] Otros Artículos relacionados: Expresiones Lambda ,Lambda ForEach, Streams […]
¿Esto no es mas que incorporar funciones de las librerías de guava no? porque con Iterables.filter y luego aplicando una function pienso que seria lo mismo.
Pd: Explica usted de maravilla, 0 paja, imagenes/esquemas grandes y poco texto.
Un saludo y enhorabuena por el blog
Es mas complejo y mas flexible ya que es parte del core
no conocía las librerías guava, gracias por el aporte
wow !!! Todavía no termino de comprender java 7, cuando me sorprende cada vez mas java 8
Gracias por actualizarnos !! Saludos
Me alegro te haya sido útil 🙂
Hola Cecilio, una pregunta este fragmento de código gasto->gasto.getImporte()*1.21 me suena a que es una lambda, pero me causa duda porque no haces uso de interfaz alguna verdad?
Una expresión lambda puede verse como un microinterface , ya que solo tiene un método
Hola Cecilio, tengo una duda con esto de los Stream y las expresiones lmbda. Tengo una lista de Strings, a la cual le tengo que sustituir el último carácter del último elemento de la lista, como se podría hacer?? Es que no encuentro la manera usando lista.stream()….. a ver si me puedes echar una mano. Gracias.
mira esto 🙂