SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Java 8
Time to join the Future
Ponentes:
Ignacio Molina Cuquerella
Héctor Pardo González
1. Time
2. Functional Programming
3. Optionals
4. Collection Streams
5. Concurrency
Empieza el viaje
Time
Clock
La clase Clock aparece para reducir el uso de métodos estáticos
y facilitar el desarrollo de pruebas en casos donde es necesario
trabajar con la fecha y hora actuales
• Dependencia inyectable
• Métodos factoría
• Abstracta
• Múltiples implementaciones
• SystemClock, TickClock, FixedClock, OffsetClock
Java 8 :: Time
DateTime
• Basado en la biblioteca Joda-Time
• Surge por la necesidad de tener una conciencia global de la hora
• Un tipo de precisión diferente según la necesidad
• ZonedDateTime, OffsetDateTime, LocalDateTime, y más
• Inmutable
• Compatible con Clock
ZonedDateTime date = ZonedDateTime.now(clock)
• Operaciones con TemporalAmount
• Parser personalizable mediante DateTimeFormatter
Java 8 :: Time
Units - TemporalAmount
Duration
• Permite manejar distintas
magnitudes de tiempo de
tipo exacto (horas, minutos,
segundos, etc)
• Basada en segundos y
nanosegundos
Period
• Pensado para manejar
unidades de tiempo más
abstractas (años, meses,
semanas, etc)
• Para operar con fechas
• Basada en años, meses y
días
Pero hay más…
Java 8 :: Time
Bajemos a ver un poco
de código...
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
Functional
Programming
Definición y características
• Es un paradigma de la programación declarativa basado en el uso de funciones
matemáticas.
• Tiene sus raíces en el cálculo lambda.
• No hay efectos colaterales: el valor generado por una función depende exclusivamente
de los argumentos pasados a la función.
• No hay mutabilidad en variables.
• Funciones de primera clase: las funciones se tratan como objetos con el
comportamiento que ello conlleva, eg. ser almacenadas en una variable.
Function<Integer, Integer> addTwo = value -> value + 2
• Funciones de orden superior: son funciones que pueden tomar otras funciones como
argumentos o devolverlos como resultados.
int myMethod(Function<Integer,Integer> f)
Java 8 :: Functional Programming
Interfaz funcional y expresión lambda
• Una interfaz funcional es aquella interfaz que sólo define un método abstracto.
• Se define con la anotación @FunctionalInterface
• Se puede expresar mediante una expresión lambda.
• Ejemplo:
λ expression
Java 8 :: Functional Programming
Programación
Imperativa
Programación
Funcional
Define un algoritmo en el que se
describen los pasos necesarios
para solucionar un problema.
Se describe el problema que se
quiere solucionar mediante
funciones sin efectos
colaterales.
Java 8 :: Functional Programming
Ejemplos
java.util.function
Interfaz Funcional Propósito Expresión Lambda
Consumer<T> Operación que acepta un argumento y no devuelve ningún resultado x -> { }
Function<T, R> Operación que acepta un argumento y produce un resultado x -> y
Predicate<T> Operación que acepta un argumento y devuelve true/false x -> true
Supplier<T> Operación que no acepta argumentos y proporciona un resultado () -> x
BiFunction<T, U, R> Operación que devuelve un resultado a partir de dos argumentos (x, y) -> z
BiPredicate<T, U> Operación que acepta dos argumentos y devuelve true/false (x, y) -> false
... ... ...
Java 8 :: Functional Programming
Bajemos a ver un poco
de código...
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
Porque hay cosas
que pueden ir
mal...
Optionals
Qué son y por qué usarlos opcionales
• Te salvan de situaciones con null
• Optional.Empty es más versátil que null
• Interfaz fluida
• Utiliza el nuevo paradigma funcional
• Facilita evitar la divergencia de flujos en distintas ramas
• Falla rápido (null ó empty)
Java 8 :: Optional
Cuándo
SÍ
• Cuando tengas la tentación de devolver un null
• Cuando quieras operar con un campo que pueda no existir
NO
• Como parámetros
• Dentro de estructuras de datos (Colecciones)
• Como dato a serializar
• Como atributo de clase
Java 8 :: Optional
Método Estático Función Estado Descripción
of Sí - Creación Crea un nuevo opcional lanza excepción si está vacío
ofNullable Sí - Creación Crea un nuevo opcional
empty Sí - Creación Crea un opcional que siempre será vacío
filter No Predicate Intermedio Elimina el contenido que no cumpla el predicado
map No Function Intermedio Transforma el contenido
flatMap No Function Intermedio Ataja una indirección de optionales
isPresent No - Final Nos dice si existe un contenido
ifPresent No Consumer Final Ejecuta un bloque usando el contenido
get No - Final Devuelve el contenido o en su defecto lanza una excepción
orElse No - Final Devuelve el contenido o en su defecto el valor dado
orElseGet No Supplier Final Devuelve el contenido del opcional o en su defecto del bloque dado
orElseThrow No Supplier Final Devuelve el contenido o lanza la excepción especificada
java.util.Optional<T>
Java 8 :: Optional
Bajemos a ver un poco
de código...
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
Collection
Streams
Definición y características I
• Clase principal: Stream<T> perteneciente a java.util.stream. Se compone de tres elementos:
1. Fuente de datos.
2. Operaciones intermedias.
3. Operación final.
• Tipos de operaciones:
• Intermedias: filter(), map(), distinct(), skip(), limit(), ...
• Finales: collect(), reduce(), findAny(), noneMatch(), count(), …
• Las operaciones intermedias son perezosas: sólo se invocarán si se ejecuta una
operación final y siempre en el orden definido. El pipeline de operaciones se ejecutará
completo para cada elemento.
Java 8 :: Collection Streams
Definición y características II
• Iteración interna vs iteración externa del paradigma imperativo.
• Ejecutar una operación final hace al stream inaccesible y no podrá ser reutilizado:
Java 8 :: Collection Streams
Invocación perezosa
¿Cuántos logs veremos por pantalla?
Java 8 :: Collection Streams
Ejemplo Java 7 vs Java 8
Java 8 :: Collection Streams
Bajemos a ver un poco
de código...
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
Concurrency
CompletionStage
• Trabajo asíncrono (No bloqueante)
• CompletableFuture es la implementación de referencia
• Permite trabajar de una forma sencilla con futuros
• Es soportado en frameworks asíncronos
• Play Framework versión 2
• Spring Boot versión 2
• Probablemente más...
Java 8 :: Concurrency
Método Estático Función Productor Descripción
runAsync Sí Runnable No Crea un nuevo completable y comienza a ejecutar el trabajo
supplyAsync Sí Supplier Si Crea un nuevo completable y comienza el trabajo
thenApply No Function Si Transforma el resultado de un completable mediante otro
thenAccept No Consumer No Realiza una tarea a partir del resultado de dos completables
thenCompose No Function Si Asimila un completable producido a partir de otro
thenCombine No BiFunction Si Transforma el contenido de dos completables en uno nuevo
exceptionally No Function Si Ejecuta una tarea cuando el completable termine de forma excepcional
Metodos más utilizados
java.util.concurrent.CompletionStage<T>
Java 8 :: Concurrency
Método Estático Función Productor Descripción
runAfterBoth No Runnable No Realiza una tarea cuando ambos completables terminan
thenAcceptBoth No BiConsumer No Realiza una tarea a partir del resultado de dos completables
runAfterEither No Runnable No Realiza una tarea cuando alguno de los dos completables termina
applyToEither No Function Si Transforma el resultado del primer completable en terminar
acceptEither No Consumer No Realiza una tarea a partir del primer completable que termine
whenComplete No BiConsumer No Realiza una tarea cuando el completable termine aunque lo haga de forma
excepcional, no altera el resultado
handle No BiFunction Si Ejecuta una tarea cuando el completable termine aunque lo haga de forma
excepcional
Otros metodos
java.util.concurrent.CompletionStage<T>
Java 8 :: Concurrency
Y más… CompletableFuture
anyOf
• Acepta un array de completables
• Realiza una tarea cuando alguna
de las anteriores se ha
completado
allOf
• Acepta un array de completables
• Realiza una tarea cuando todas
las anteriores se han
completado
Todos los métodos anteriores permiten realizar una correcta
sincronización, sin tener que forzar en ningún momento bloqueo
del hilo de ejecución, mediante el encadenando de tareas
asíncronas. Pero pueden ser algo engorrosas cuando
dependemos del resultado de muchas tareas.
Java 8 :: Concurrency
Callbacks
La clase CompletableFuture permite ser utilizada como callback
mediante la instanciación como incompleto.
CompletableFuture<T> promise = new CompletableFuture<>();
Que en un futuro será completado.
promise.complete(result);
Java 8 :: Concurrency
Executors
Los métodos definidos por CompletionStage tienen una versión
alternativa mediante sobrecarga que permite establecer un pool
de hilos para ejecutar las tareas.
Normalmente a estos métodos se les distingue porque el nombre
termina por Async y aceptan un Executor.
<U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn) -> conserva el pool
<U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn) -> ForkJoin
<U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn, Executor executor)
Java 8 :: Concurrency
Bajemos a ver un poco
de código...
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
The road so far…
● Time
● Functional Programming
● Optionals
● Collection Streams
● Concurrency
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
Ponentes:
Ignacio Molina Cuquerella - imolina@paradigmadigital.com
Héctor Pardo González - hpardo@paradigmadigital.com
Map<String, List<String>> map = generateMap();
map.entrySet()
.stream()
.map(entry -> entry.getValue()
.stream()
.map(value -> new String[] { entry.getKey(), value })
.flatMap(Arrays::stream))
.flatMap(Function.identity())
.toArray(String[]::new);
() -> () -> “Hello World!”
¿Eres capaz de interpretar esta expresión?
¿Sabrías decirme qué hace este bloque de
código?
¡Vente a descubrirlo!

Weitere ähnliche Inhalte

Was ist angesagt? (20)

Guia1 programacion de-procesos_concurrentes-hilos
Guia1 programacion de-procesos_concurrentes-hilosGuia1 programacion de-procesos_concurrentes-hilos
Guia1 programacion de-procesos_concurrentes-hilos
 
Máquina virtual en java
Máquina virtual en javaMáquina virtual en java
Máquina virtual en java
 
Un Framework de Triggers Rock Solid en Salesforce
Un Framework de Triggers Rock Solid en SalesforceUn Framework de Triggers Rock Solid en Salesforce
Un Framework de Triggers Rock Solid en Salesforce
 
De Threads a CompletableFutures
De Threads a CompletableFuturesDe Threads a CompletableFutures
De Threads a CompletableFutures
 
Microservicios, en qué lío me he metido
Microservicios, en qué lío me he metidoMicroservicios, en qué lío me he metido
Microservicios, en qué lío me he metido
 
Thread 02
Thread 02Thread 02
Thread 02
 
Statement
StatementStatement
Statement
 
Java Threads (Hilos en Java)
Java Threads (Hilos en Java)Java Threads (Hilos en Java)
Java Threads (Hilos en Java)
 
Thread 01
Thread 01Thread 01
Thread 01
 
Uso de hilos
Uso de hilosUso de hilos
Uso de hilos
 
Multitarea e hilos en java
Multitarea e hilos en javaMultitarea e hilos en java
Multitarea e hilos en java
 
Estructuras de iteracion
Estructuras de iteracionEstructuras de iteracion
Estructuras de iteracion
 
Introducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores JavaIntroducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores Java
 
Ios.s14
Ios.s14Ios.s14
Ios.s14
 
Subprocesamiento Mùltiple
Subprocesamiento MùltipleSubprocesamiento Mùltiple
Subprocesamiento Mùltiple
 
Hilos En Java
Hilos En JavaHilos En Java
Hilos En Java
 
Hilos – threads en java
Hilos – threads   en javaHilos – threads   en java
Hilos – threads en java
 
Mecanismos de exclusion mutua y algoritmos
Mecanismos de exclusion mutua y algoritmosMecanismos de exclusion mutua y algoritmos
Mecanismos de exclusion mutua y algoritmos
 
Programacion concurrente
Programacion concurrenteProgramacion concurrente
Programacion concurrente
 
Time Tables & MTBF
Time Tables & MTBFTime Tables & MTBF
Time Tables & MTBF
 

Ähnlich wie Java 8 time to join the future

Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubGlobalLogic Latinoamérica
 
Introduccion a Programacion Reactiva
Introduccion a Programacion ReactivaIntroduccion a Programacion Reactiva
Introduccion a Programacion ReactivaAndres Almiray
 
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesUsando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesMartín Volpe
 
Ingenieria de sw Junit
Ingenieria de sw JunitIngenieria de sw Junit
Ingenieria de sw Junitpattyand89
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones LambdasEudris Cabrera
 
Programación Funcional y Orientada a Objetos con Asincronismos
Programación Funcional y Orientada a Objetos con AsincronismosProgramación Funcional y Orientada a Objetos con Asincronismos
Programación Funcional y Orientada a Objetos con AsincronismosVíctor Bolinches
 
2/9 Curso JEE5, Soa, Web Services, ESB y XML
2/9 Curso JEE5, Soa, Web Services, ESB y XML2/9 Curso JEE5, Soa, Web Services, ESB y XML
2/9 Curso JEE5, Soa, Web Services, ESB y XMLJuan Carlos Rubio Pineda
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJSRodrigo Pimentel
 
Taller de Pascal 01.pptx
Taller de Pascal 01.pptxTaller de Pascal 01.pptx
Taller de Pascal 01.pptxMatiasEscobar24
 
Manuales ...
Manuales ...Manuales ...
Manuales ...elidetjc
 

Ähnlich wie Java 8 time to join the future (20)

Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
Functional SE.pdf
Functional SE.pdfFunctional SE.pdf
Functional SE.pdf
 
Java 1.8:Road to Functional Language
Java 1.8:Road to Functional LanguageJava 1.8:Road to Functional Language
Java 1.8:Road to Functional Language
 
Introduccion a Programacion Reactiva
Introduccion a Programacion ReactivaIntroduccion a Programacion Reactiva
Introduccion a Programacion Reactiva
 
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesUsando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
 
Ingenieria de sw Junit
Ingenieria de sw JunitIngenieria de sw Junit
Ingenieria de sw Junit
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones Lambdas
 
Programación Funcional y Orientada a Objetos con Asincronismos
Programación Funcional y Orientada a Objetos con AsincronismosProgramación Funcional y Orientada a Objetos con Asincronismos
Programación Funcional y Orientada a Objetos con Asincronismos
 
2/9 Curso JEE5, Soa, Web Services, ESB y XML
2/9 Curso JEE5, Soa, Web Services, ESB y XML2/9 Curso JEE5, Soa, Web Services, ESB y XML
2/9 Curso JEE5, Soa, Web Services, ESB y XML
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJS
 
Comandos Java
Comandos JavaComandos Java
Comandos Java
 
Comandos de Java
Comandos de JavaComandos de Java
Comandos de Java
 
PCJ Sesión 9: Threads
PCJ Sesión 9: ThreadsPCJ Sesión 9: Threads
PCJ Sesión 9: Threads
 
Un vistazo a java 8
Un vistazo a java 8Un vistazo a java 8
Un vistazo a java 8
 
Taller de Pascal 01.pptx
Taller de Pascal 01.pptxTaller de Pascal 01.pptx
Taller de Pascal 01.pptx
 
Java
JavaJava
Java
 
Ajax: introducción
Ajax: introducciónAjax: introducción
Ajax: introducción
 
Documento Margarita
Documento MargaritaDocumento Margarita
Documento Margarita
 
Manuales ...
Manuales ...Manuales ...
Manuales ...
 

Mehr von Paradigma Digital

Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Paradigma Digital
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxParadigma Digital
 
Meetup microservicios: API Management
Meetup microservicios: API ManagementMeetup microservicios: API Management
Meetup microservicios: API ManagementParadigma Digital
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.Paradigma Digital
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxParadigma Digital
 
Implementando microservicios
Implementando microserviciosImplementando microservicios
Implementando microserviciosParadigma Digital
 
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!Paradigma Digital
 
Manuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octManuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octParadigma Digital
 
¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?Paradigma Digital
 

Mehr von Paradigma Digital (20)

Ddd + ah + microservicios
Ddd + ah + microserviciosDdd + ah + microservicios
Ddd + ah + microservicios
 
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
 
Have you met Istio?
Have you met Istio?Have you met Istio?
Have you met Istio?
 
Linkerd a fondo
Linkerd a fondoLinkerd a fondo
Linkerd a fondo
 
Horneando apis
Horneando apisHorneando apis
Horneando apis
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFlux
 
Meetup microservicios: API Management
Meetup microservicios: API ManagementMeetup microservicios: API Management
Meetup microservicios: API Management
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
 
Implementando microservicios
Implementando microserviciosImplementando microservicios
Implementando microservicios
 
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
 
Overview atlas (1)
Overview atlas (1)Overview atlas (1)
Overview atlas (1)
 
Cómo usar google analytics
Cómo usar google analyticsCómo usar google analytics
Cómo usar google analytics
 
Transformación Digital
Transformación DigitalTransformación Digital
Transformación Digital
 
Manuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octManuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4oct
 
¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?
 
Python y Flink
Python y FlinkPython y Flink
Python y Flink
 
Kafka y python
Kafka y pythonKafka y python
Kafka y python
 
Cultura Digital Paradigma
Cultura Digital ParadigmaCultura Digital Paradigma
Cultura Digital Paradigma
 
Introducción a Kubernetes
Introducción a KubernetesIntroducción a Kubernetes
Introducción a Kubernetes
 

Java 8 time to join the future

  • 1.
  • 2. Java 8 Time to join the Future Ponentes: Ignacio Molina Cuquerella Héctor Pardo González
  • 3. 1. Time 2. Functional Programming 3. Optionals 4. Collection Streams 5. Concurrency Empieza el viaje
  • 5. Clock La clase Clock aparece para reducir el uso de métodos estáticos y facilitar el desarrollo de pruebas en casos donde es necesario trabajar con la fecha y hora actuales • Dependencia inyectable • Métodos factoría • Abstracta • Múltiples implementaciones • SystemClock, TickClock, FixedClock, OffsetClock Java 8 :: Time
  • 6. DateTime • Basado en la biblioteca Joda-Time • Surge por la necesidad de tener una conciencia global de la hora • Un tipo de precisión diferente según la necesidad • ZonedDateTime, OffsetDateTime, LocalDateTime, y más • Inmutable • Compatible con Clock ZonedDateTime date = ZonedDateTime.now(clock) • Operaciones con TemporalAmount • Parser personalizable mediante DateTimeFormatter Java 8 :: Time
  • 7. Units - TemporalAmount Duration • Permite manejar distintas magnitudes de tiempo de tipo exacto (horas, minutos, segundos, etc) • Basada en segundos y nanosegundos Period • Pensado para manejar unidades de tiempo más abstractas (años, meses, semanas, etc) • Para operar con fechas • Basada en años, meses y días Pero hay más… Java 8 :: Time
  • 8. Bajemos a ver un poco de código... GitHub repository: https://github.com/ignaciomolina/Java8TheRoadSoFar
  • 10. Definición y características • Es un paradigma de la programación declarativa basado en el uso de funciones matemáticas. • Tiene sus raíces en el cálculo lambda. • No hay efectos colaterales: el valor generado por una función depende exclusivamente de los argumentos pasados a la función. • No hay mutabilidad en variables. • Funciones de primera clase: las funciones se tratan como objetos con el comportamiento que ello conlleva, eg. ser almacenadas en una variable. Function<Integer, Integer> addTwo = value -> value + 2 • Funciones de orden superior: son funciones que pueden tomar otras funciones como argumentos o devolverlos como resultados. int myMethod(Function<Integer,Integer> f) Java 8 :: Functional Programming
  • 11. Interfaz funcional y expresión lambda • Una interfaz funcional es aquella interfaz que sólo define un método abstracto. • Se define con la anotación @FunctionalInterface • Se puede expresar mediante una expresión lambda. • Ejemplo: λ expression Java 8 :: Functional Programming
  • 12. Programación Imperativa Programación Funcional Define un algoritmo en el que se describen los pasos necesarios para solucionar un problema. Se describe el problema que se quiere solucionar mediante funciones sin efectos colaterales. Java 8 :: Functional Programming
  • 13. Ejemplos java.util.function Interfaz Funcional Propósito Expresión Lambda Consumer<T> Operación que acepta un argumento y no devuelve ningún resultado x -> { } Function<T, R> Operación que acepta un argumento y produce un resultado x -> y Predicate<T> Operación que acepta un argumento y devuelve true/false x -> true Supplier<T> Operación que no acepta argumentos y proporciona un resultado () -> x BiFunction<T, U, R> Operación que devuelve un resultado a partir de dos argumentos (x, y) -> z BiPredicate<T, U> Operación que acepta dos argumentos y devuelve true/false (x, y) -> false ... ... ... Java 8 :: Functional Programming
  • 14. Bajemos a ver un poco de código... GitHub repository: https://github.com/ignaciomolina/Java8TheRoadSoFar
  • 15. Porque hay cosas que pueden ir mal...
  • 17. Qué son y por qué usarlos opcionales • Te salvan de situaciones con null • Optional.Empty es más versátil que null • Interfaz fluida • Utiliza el nuevo paradigma funcional • Facilita evitar la divergencia de flujos en distintas ramas • Falla rápido (null ó empty) Java 8 :: Optional
  • 18. Cuándo SÍ • Cuando tengas la tentación de devolver un null • Cuando quieras operar con un campo que pueda no existir NO • Como parámetros • Dentro de estructuras de datos (Colecciones) • Como dato a serializar • Como atributo de clase Java 8 :: Optional
  • 19. Método Estático Función Estado Descripción of Sí - Creación Crea un nuevo opcional lanza excepción si está vacío ofNullable Sí - Creación Crea un nuevo opcional empty Sí - Creación Crea un opcional que siempre será vacío filter No Predicate Intermedio Elimina el contenido que no cumpla el predicado map No Function Intermedio Transforma el contenido flatMap No Function Intermedio Ataja una indirección de optionales isPresent No - Final Nos dice si existe un contenido ifPresent No Consumer Final Ejecuta un bloque usando el contenido get No - Final Devuelve el contenido o en su defecto lanza una excepción orElse No - Final Devuelve el contenido o en su defecto el valor dado orElseGet No Supplier Final Devuelve el contenido del opcional o en su defecto del bloque dado orElseThrow No Supplier Final Devuelve el contenido o lanza la excepción especificada java.util.Optional<T> Java 8 :: Optional
  • 20. Bajemos a ver un poco de código... GitHub repository: https://github.com/ignaciomolina/Java8TheRoadSoFar
  • 22. Definición y características I • Clase principal: Stream<T> perteneciente a java.util.stream. Se compone de tres elementos: 1. Fuente de datos. 2. Operaciones intermedias. 3. Operación final. • Tipos de operaciones: • Intermedias: filter(), map(), distinct(), skip(), limit(), ... • Finales: collect(), reduce(), findAny(), noneMatch(), count(), … • Las operaciones intermedias son perezosas: sólo se invocarán si se ejecuta una operación final y siempre en el orden definido. El pipeline de operaciones se ejecutará completo para cada elemento. Java 8 :: Collection Streams
  • 23. Definición y características II • Iteración interna vs iteración externa del paradigma imperativo. • Ejecutar una operación final hace al stream inaccesible y no podrá ser reutilizado: Java 8 :: Collection Streams
  • 24. Invocación perezosa ¿Cuántos logs veremos por pantalla? Java 8 :: Collection Streams
  • 25. Ejemplo Java 7 vs Java 8 Java 8 :: Collection Streams
  • 26. Bajemos a ver un poco de código... GitHub repository: https://github.com/ignaciomolina/Java8TheRoadSoFar
  • 27.
  • 29. CompletionStage • Trabajo asíncrono (No bloqueante) • CompletableFuture es la implementación de referencia • Permite trabajar de una forma sencilla con futuros • Es soportado en frameworks asíncronos • Play Framework versión 2 • Spring Boot versión 2 • Probablemente más... Java 8 :: Concurrency
  • 30. Método Estático Función Productor Descripción runAsync Sí Runnable No Crea un nuevo completable y comienza a ejecutar el trabajo supplyAsync Sí Supplier Si Crea un nuevo completable y comienza el trabajo thenApply No Function Si Transforma el resultado de un completable mediante otro thenAccept No Consumer No Realiza una tarea a partir del resultado de dos completables thenCompose No Function Si Asimila un completable producido a partir de otro thenCombine No BiFunction Si Transforma el contenido de dos completables en uno nuevo exceptionally No Function Si Ejecuta una tarea cuando el completable termine de forma excepcional Metodos más utilizados java.util.concurrent.CompletionStage<T> Java 8 :: Concurrency
  • 31. Método Estático Función Productor Descripción runAfterBoth No Runnable No Realiza una tarea cuando ambos completables terminan thenAcceptBoth No BiConsumer No Realiza una tarea a partir del resultado de dos completables runAfterEither No Runnable No Realiza una tarea cuando alguno de los dos completables termina applyToEither No Function Si Transforma el resultado del primer completable en terminar acceptEither No Consumer No Realiza una tarea a partir del primer completable que termine whenComplete No BiConsumer No Realiza una tarea cuando el completable termine aunque lo haga de forma excepcional, no altera el resultado handle No BiFunction Si Ejecuta una tarea cuando el completable termine aunque lo haga de forma excepcional Otros metodos java.util.concurrent.CompletionStage<T> Java 8 :: Concurrency
  • 32. Y más… CompletableFuture anyOf • Acepta un array de completables • Realiza una tarea cuando alguna de las anteriores se ha completado allOf • Acepta un array de completables • Realiza una tarea cuando todas las anteriores se han completado Todos los métodos anteriores permiten realizar una correcta sincronización, sin tener que forzar en ningún momento bloqueo del hilo de ejecución, mediante el encadenando de tareas asíncronas. Pero pueden ser algo engorrosas cuando dependemos del resultado de muchas tareas. Java 8 :: Concurrency
  • 33. Callbacks La clase CompletableFuture permite ser utilizada como callback mediante la instanciación como incompleto. CompletableFuture<T> promise = new CompletableFuture<>(); Que en un futuro será completado. promise.complete(result); Java 8 :: Concurrency
  • 34. Executors Los métodos definidos por CompletionStage tienen una versión alternativa mediante sobrecarga que permite establecer un pool de hilos para ejecutar las tareas. Normalmente a estos métodos se les distingue porque el nombre termina por Async y aceptan un Executor. <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn) -> conserva el pool <U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn) -> ForkJoin <U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn, Executor executor) Java 8 :: Concurrency
  • 35. Bajemos a ver un poco de código... GitHub repository: https://github.com/ignaciomolina/Java8TheRoadSoFar
  • 36. The road so far… ● Time ● Functional Programming ● Optionals ● Collection Streams ● Concurrency
  • 37. GitHub repository: https://github.com/ignaciomolina/Java8TheRoadSoFar Ponentes: Ignacio Molina Cuquerella - imolina@paradigmadigital.com Héctor Pardo González - hpardo@paradigmadigital.com
  • 38. Map<String, List<String>> map = generateMap(); map.entrySet() .stream() .map(entry -> entry.getValue() .stream() .map(value -> new String[] { entry.getKey(), value }) .flatMap(Arrays::stream)) .flatMap(Function.identity()) .toArray(String[]::new); () -> () -> “Hello World!” ¿Eres capaz de interpretar esta expresión? ¿Sabrías decirme qué hace este bloque de código? ¡Vente a descubrirlo!