Java 8 - Time To Join The Future
Java 8 - Time To Join The Future
Java 8
Time to join the Future
Empieza el viaje
1. Time
2. Functional Programming
3. Optionals
4. Collection Streams
5. Concurrency
Time
Java 8 :: Time
Clock
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)
Units - TemporalAmount
Duration Period
• Permite manejar distintas • Pensado para manejar
magnitudes de tiempo de unidades de tiempo más
tipo exacto (horas, minutos, abstractas (años, meses,
segundos, etc) semanas, etc)
• Basada en segundos y • Para operar con fechas
nanosegundos • Basada en años, meses y
días
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
λ expression
Java 8 :: Functional Programming
Programación
Imperativa
Define un algoritmo en el que se
describen los pasos necesarios
para solucionar un problema.
Programación
Funcional
Se describe el problema que se
quiere solucionar mediante
funciones sin efectos
colaterales.
Java 8 :: Functional Programming
Ejemplos
java.util.function
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
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
java.util.Optional<T>
orElseGet No Supplier Final Devuelve el contenido del opcional o en su defecto del bloque dado
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(), …
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
CompletionStage
thenAccept No Consumer No Realiza una tarea a partir del resultado de dos completables
exceptionally No Function Si Ejecuta una tarea cuando el completable termine de forma excepcional
Java 8 :: Concurrency
Otros metodos
java.util.concurrent.CompletionStage<T>
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
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
Java 8 :: Concurrency
Y más… CompletableFuture
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.
anyOf allOf
• Acepta un array de completables • Acepta un array de completables
• Realiza una tarea cuando alguna • Realiza una tarea cuando todas
de las anteriores se ha las anteriores se han
completado completado
Java 8 :: Concurrency
Callbacks
Executors
<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)
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
Ponentes:
Ignacio Molina Cuquerella - [email protected]
Héctor Pardo González - [email protected]
¿Eres capaz de interpretar esta expresión?
() -> () -> “Hello World!”
¡Vente a descubrirlo!