Java 1.8:Road to Functional Language

Preview:

Citation preview

Java 1.8:Road to Functional LanguageJavier Antoniucci

Cristian Romero Matesanz (cristian.romero@adesis.com)

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

Recommended