31
Java 1.8:Road to Functional Language Javier Antoniucci Cristian Romero Matesanz ([email protected])

Java 1.8:Road to Functional Language

Embed Size (px)

Citation preview

Page 1: Java 1.8:Road to Functional Language

Java 1.8:Road to Functional LanguageJavier Antoniucci

Cristian Romero Matesanz ([email protected])

Page 2: Java 1.8:Road to Functional Language

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

Page 3: Java 1.8:Road to Functional Language

Historia de Java

Opt

iona

l, ne

w D

ate-

Tim

e A

PIs

,

Page 4: Java 1.8:Road to Functional Language

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

Page 5: Java 1.8:Road to Functional Language

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)

Page 6: Java 1.8:Road to Functional Language

Functional Interfaces: Ejemplo

Page 7: Java 1.8:Road to Functional Language

Lambda

▪Se puede definir como una función anónima (Método sin declaración).

▪(arg1, arg2...) -> { body } ▪(type1 arg1, type2 arg2...) -> { body }

Page 8: Java 1.8:Road to Functional Language

Instanciar @functionalinterfaces mediante lambdas (is magic :=)

Instanciadas en tiempo de compilación

Page 9: Java 1.8:Road to Functional Language

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

Page 10: Java 1.8:Road to Functional Language

Funciones en java (2/2)

Page 11: Java 1.8:Road to Functional Language

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.

Page 12: Java 1.8:Road to Functional Language

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;

Page 13: Java 1.8:Road to Functional Language

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

Page 14: Java 1.8:Road to Functional Language

Referencias estáticas a métodos y constructores

Page 15: Java 1.8:Road to Functional Language

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)

Page 16: Java 1.8:Road to Functional Language

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

Page 17: Java 1.8:Road to Functional Language

Java Streams: Concepto pipeline

Page 18: Java 1.8:Road to Functional Language

Java Streams: concepto de pipeline

Page 19: Java 1.8:Road to Functional Language

Java Streams: resumen de operaciones en Streams

Page 20: Java 1.8:Road to Functional Language

Java Streams: resumen de operaciones en Streams

Page 21: Java 1.8:Road to Functional Language

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 !!!!!!

Page 22: Java 1.8:Road to Functional Language

Optional: Bye Bye Null Pointer!!!!

Page 23: Java 1.8:Road to Functional Language

Presentación clase Optional!!!!

▪Clase introducida en java 1.8 para permitir valores opcionales.

Page 24: Java 1.8:Road to Functional Language

Métodos mas importantes clase Optional!!!!

Page 25: Java 1.8:Road to Functional Language

Métodos más importantes clase Optional!!!!

Page 26: Java 1.8:Road to Functional Language

Métodos más importantes clase Optional!!!

Page 27: Java 1.8:Road to Functional Language

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.

Page 28: Java 1.8:Road to Functional Language

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)

Page 29: Java 1.8:Road to Functional Language

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

Page 30: Java 1.8:Road to Functional Language

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 :(

Page 31: Java 1.8:Road to Functional Language

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