java 1.8:road to functional language
TRANSCRIPT
Java 1.8:Road to Functional LanguageJavier Antoniucci
Cristian Romero Matesanz ([email protected])
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
Historia de Java
Opt
iona
l, ne
w D
ate-
Tim
e A
PIs
,
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
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)
Functional Interfaces: Ejemplo
Lambda
▪Se puede definir como una función anónima (Método sin declaración).
▪(arg1, arg2...) -> { body } ▪(type1 arg1, type2 arg2...) -> { body }
Instanciar @functionalinterfaces mediante lambdas (is magic :=)
▪
Instanciadas en tiempo de compilación
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
Funciones en java (2/2)
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.
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;
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
Referencias estáticas a métodos y constructores
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)
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
Java Streams: Concepto pipeline
Java Streams: concepto de pipeline
Java Streams: resumen de operaciones en Streams
Java Streams: resumen de operaciones en Streams
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 !!!!!!
Optional: Bye Bye Null Pointer!!!!
Presentación clase Optional!!!!
▪Clase introducida en java 1.8 para permitir valores opcionales.
Métodos mas importantes clase Optional!!!!
Métodos más importantes clase Optional!!!!
Métodos más importantes clase Optional!!!
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.
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)
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
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 :(
Code: 1Destination: LondonDuration
Hours:1Minutes: 30
NumPassengers: 180NumSeats: 200Price: 1000
Code: 2Destination: MadridDuration
Hours:2Minutes: 30
NumPassengers: 180NumSeats: 255Price: 800
Code: 3Destination: ParisDuration
Hours:3Minutes: 30
NumPassengers: 199NumSeats: 200Price: 400
Code: 4Destination: JapanDuration
Hours:3Minutes: 30NumPassengers: 180NumSeats: 200/180 (si full flight)Price: 2000
Ejemplo práctico vuelos
https://github.com/cristianprofile/testing-java1.8-features