Este documento presenta una introducción a las nuevas características de Java 1.8 relacionadas con la programación funcional, incluyendo interfaces funcionales, expresiones lambda, referencias estáticas a métodos y constructores, streams y la clase Optional. También discute cómo estas características pueden usarse para mejorar el código Java existente y hacerlo más conciso y funcional.
2. Presentación
▪ Cristian Romero Matesanz
▪ Ingeniero Informático Uc3m
▪ Colegiado 105 colegio Ingenieros Informáticos de Madrid
▪ Arquitecto Software Adesis Netlife
▪ 8 años de profesión
▪Especialista en Aplicaciones basadas en Java, J2ee,
Spring.
▪Pragmático/ Obsesionado con realizar software probado.
▪Apasionado por el continuo aprendizaje dentro de la
profesión (Spring Boot, Java 1.8, Spring Integration,
Jhipsters, Neo4j etc....).
▪Amante y apasionado de la música electrónica.
https://github.com/cristianprofile
4. Concepto programación
funcional
▪ Me: "Sofia, let's put the toys away. Is there a toy on the
ground"
▪ Sofia: "Yes, the ball"
▪ Me: "Ok, put the ball in the box. Is there something else?"
▪ Sofia: "Yes, there is my doll"
▪ Me: "Ok, put the doll in the box. Is there something else?"
▪ Sofia: "Yes, there is my book"
▪ Me: "Ok, put the book in the box. Is there something
else?"
▪ Sofia: "No, nothing else"
▪ Me: "Fine, we are done"
“put inside the box all the toys that are on
the ground".
▪ Podemos procesar varios juguetes a
la vez, uno en cada mano
▪ Puede ir recogiendo los juguetes que
más le interesen por cercanía primero
Enfoque funcional
Enfoque iterativo clásico
5. Functional Interfaces
▪ Un único método abstracto
▪ N métodos default y estáticos
▪ Importante: pueden ser instanciadas usando lambdas (sin
necesidad de realizar un new de una clase que la
implemente).
▪ Deberían ir anotadas @FunctionalInterface (no obligatorio)
▪ Similitud con clases abstractas → diferencia las clases
abstractas pueden tener estado e incluir constructores (las
variables son final)
7. Lambda
▪ Se puede definir como una función anónima (Método sin
declaración).
▪ (arg1, arg2...) -> { body }
▪ (type1 arg1, type2 arg2...) -> { body }
9. Funciones en java (1/2)
▪ Existe la creencia que las funciones son nuevas en la
versión java 1.8, pero en realidad todos las hemos usado
desde java 5/6/7.
Clase anónima
11. Lambda recordatorio
▪ Lambda is only syntactic sugar to simplify the
Function (or Whatever) interface
implementation by an anonymous class. It has
in fact absolutely nothing to do with functions.
▪ Java 8 does not know anything about functions.
Functions are ordinary object with ordinary
methods that we may call. Nothing more.
▪ Java solo dispone de funciones de uno o dos
parámetros, si quiero más parámetros entonces
necesitare la técnica de Currificar la función.
12. Referencias estáticas a métodos y
constructores
▪ Mecanismo que permite el acceso a métodos y constructores
de manera sencilla
▪ Sintaxis: NombreClase::nombreMetodo
▪ Ejemplo:
▪ Math::addExact;
▪ Person::new;
13. Referencias estáticas a métodos y
constructores
Referencia método estático
Referencia método clase con
un objeto arbitrario
Referencia método de la clase con
instancia de objeto especifica
Referencia constructor
Método Sin argumentos
Método 1 argumento
Método 1 argumento
15. Lambdas e interfaces funcional:
Cuál es su utilidad dentro de java?
▪ Los métodos permiten definir como parámetro de llamada
una interfaz funcional: parámetro lambda.(función anónima)
▪ Java 8 ha reescrito y creado nuevas clases basadas en este
potente mecanismo, de modo que podemos pasar como
parámetro una lambda.
▪ Este enfoque permite usar gran parte de los mecanismos en
los que se basa la programación funcional (no todos ya que
java no fue concebido como un lenguaje funcional)
16. Java Streams: bienvenido al
mundo funcional!!!!
▪ Api añadida a las colecciones para permitir manipular de
manera sencilla y funcional.
▪ Se basa en concepto de pipeline de operaciones:
▪ Operaciones intermedias: realizan una operación y devuelve un
nuevo stream
▪ Operaciones terminales: produce un resultado y cierra el stream
21. Java Streams: Stream versus
parallel Stream!!!!
▪ Como hemos comentado una de las ventajas de la
programación funcional era la posibilidad de procesar los
elementos en paralelo
▪ Para ello java 1.8 ha introducido el concepto de
paralellstream: stream().parallel().
▪ Common fork-join thread pool problem. Bloqueos por uso
compartido de hilos. (No todo podía ser bueno :) )
▪ Posible workaround: (usamos un fork nuevo no el pool común)
!!!!! Cuidado con la creación infinita de hilos !!!!!!
27. Optional: No es oro todo lo que
reluce!!!!
▪ Nuevas apis y métodos de Stream incluyen el uso de
optionals (findFirst,findAny,max,min)
▪ Las antiguas apis siguen dando la posibilidad de devolver
null.
▪ Difícil cambiar las apis por retrocompatiblidad
▪ En el futuro veremos hacia donde quieren orientar su uso:
solo para nuevas Apis.
28. Nueva interfaz Date and Time.
▪ Date/Time API ha sido movido al paquete java.time and
(Joda time format).
▪ La mayor parte de la clases son Threadsafe and immutable.
▪ LocalTime (Horas)
▪ LocalDate (Fechas)
▪ LocalDateTime (fechas y horas)
▪ Duration, Period (Operaciones sobre duración y periodos de
tiempo para operar con las clases local)
29. Frameworks que usan nuevas
features (Spring 4 :) )
▪ Interfaces call back aceptan expresiones lambdas y
referencias de métodos.
▪ Jsr 310 types: soporte para nuevo java.time
▪ Anotaciones repetidas
30. Conclusiones
▪ Gran cambio en el lenguaje. Java no es un lenguaje
funcional, por ello no tiene la potencia de otros lenguajes
concebidos en ese paradigma.
▪ Java se ha limitado a copiar, no ha creado nada nuevo,
dotando al lenguaje de clones de librerías de Fechas,
Lambdas existentes en otros lenguajes.
▪ No programar todo funcional, únicamente en lo necesario. ---
> lo que denominamos el efecto generics de java 1.5.
▪ Como siempre el hecho de que existan nuevas
funcionalidades dentro del lenguaje requieren de un esfuerzo
por parte del programador de asimilar su uso → efecto
programador deprated: bucles clásicos, clases con
variables estáticas vs enums etc...
▪ Oposición de las entidades a su implantación en producción.
Esto funciona y no se cambia!!!! Este es el más
importante, de momento solo para consumo propio o
nuevos desarrollos :(