Este documento proporciona una descripción general de las principales características introducidas en Java 7 y Java 8. Comienza con una línea de tiempo que resume las principales características de Java 7 como autoclosing, Fork/Join framework y excepciones multi-catch. Luego, describe las características clave de Java 8 como expresiones lambda, interfaces con métodos predeterminados y estáticos, referencias de métodos, API de colecciones y API de fecha y hora. Finalmente, anticipa algunas de las características planificadas para Java 9 como la modularización, API
4. Autoclosing - Try-with-resources
Java Evolution - Java 7
Desde Java 7
Antes de Java 7 Desde Java 7
BufferedReader br = null;
try {
br =
new BufferedReader(new FileReader(“text.txt”));
// Read file
} catch (IOException e) { // Handle error}
finally {
if(br!=null) {
try {
br.close();
} catch(IOException e) {}
}
}
// AutoCloseable resource is closed automatically!
try (BufferedReader br =
new BufferedReader(new File(“text.txt”)))
{
// Read file
}
catch (IOException e) { // mandatory catch block
// Handle error
}
// Veamos la clase BufferedReader en la JDK...
</> Source code: com/globallogic/training/j7/exceptions/TryWithResourcesDemo.java
5. Fork/Join framework
Java Evolution - Java 7
</> Source code: com/globallogic/training/j7/forkjoin/FolderSearchTask.java
● ForkJoinPool permite ejecutar instancias de clases que extienden de ForkJoinTask
● Los objetos ForkJoinTask permiten crear subtareas y esperar a que terminen.
● ForkJoinTask tiene dos métodos principales:
● fork(): permite a un ForkJoinTask lanzar la ejecución asíncrona. Esto permite lanzar una
nueva ForkJoinTask desde una existente.
● join(): permite a un ForkJoinTask esperar por la finalización de otra tarea.
● RecursiveTask extiende ForkJoinTask y su método compute() retorna un valor calculado.
● RecursiveAction extiende ForkJoinTask y su método compute() no retorna un valor.
El Fork-Join framework se agrega como parte de Java 7 utilizando la interface ExecutorService
para distribuir procesos en el pool de threads. Permite optimizar el rendimiento “robando” subtareas encoladas
por otras tareas y ejecutarlas.
En pseudocódigo para el uso del framework sería:
if (El trabajo es simple) then { Hacerlo directamente }
else {
dividir el trabajo en partes (fork)
invocar las partes y esperar por los resultados (join)
}
7. Type inference for generics
Java Evolution - Java 7
Java 5 y 6 Desde Java 7
Map<String, List<String>> retVal =
new HashMap<String, List<String>>();
public static Map<String, List<String>>
parseQueryString(String queryString){
if(queryString == null) {
return new HashMap<String, List<String>>();
}
}
// Left to right type inference
Map<String, List<String>> retVal = new HashMap<>();
// Return type inference
public static Map<String, List<String>>
parseQueryString(String queryString){
if(queryString == null) {
return new HashMap<>();
}
}
8. Antes de Java 7
Strings for switchs
Java Evolution - Java 7
Desde Java 7
if("Java".equals(language)) {
// static
} else if("Scala".equals(language)) {
// dynamic
} else {
// Other
}
switch(language)) {
case "Java":
// static
break;
case "Scala":
// dynamic
break;
default:
// Other
}
10. ● Es un sistema formal diseñado para investigar la definición de función, la noción de aplicación de funciones y la
recursión.
● Consiste en un sistema simple de definición de funciones y sustitución de variables.
● Cualquier función computable puede ser expresada y evaluada.
● Por ejemplo, Id(x) = x ó su equivalente λx.x , puede ser escrita como: a -> a
● La función Suma(x,y) = x + y , puede ser escrita como: (a,b) -> a + b
● Se observa que las funciones no necesitan ser nombradas (anónimas).
● El nombre de los argumentos es irrelevante.
● Toda función que requiere 2 argumentos puede ser currificada.
● Currificar significa transformar una función que utiliza múltiples argumentos en una función que utiliza un único
argumento.
● La función suma no currificada sería: (x,y) -> x + y
● La función suma currificada sería: x -> ( y -> x + y )
Lambda Expressions
Java Evolution - Java 8
Es la principal novedad de Java 8...pero que es el cálculo lambda ?
11. ● Elemento fundamental en lenguajes funcionales como Haskell y también presente en lenguajes
basados en la JVM como Clojure y Scala.
● Ejemplo en Haskell:
map :: (a -> b) -> [a] -> [b]
map ((a,b) -> a + b) [(1,2),(2,3),(3,4)] → Resultado?
● Ejemplo en Clojure:
map + [1 2 3] [2 3 4] → Resultado?
Es la principal novedad de Java 8. Se incluye este elemento fundamental del paradigma funcional.
Lambda Expressions
Java Evolution - Java 8
12. ● Ejemplo en Scala:
val l = List(1,2,3,4,5)
l.map( x => x*2 ) → Resultado?
● Ejemplo en C#:
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = ?
}
● Sintaxis Lambda en Java 8:
● (parameters) -> expression
● (parameters) -> statement
● (parameters) -> { statements }
Lambda Expressions
Java Evolution - Java 8
</> Source code: com/globallogic/training/j8/lambdas/*.java
13. ● Alternativa a las clases abstractas (en algunos casos)
● No poseen estado y no pueden definir un constructor.
● El uso de un método default o implementar una clase abstracta dependerá del problema a resolver.
● Los métodos estáticos son similares a los métodos default, excepto que no podemos hacer override
en las clases de implementación.
Permiten incorporar comportamiento a una interface sin afectar a las clases que la implementan.
Interfaces: Default and Static Methods
Java Evolution - Java 8
</> Source code: com/globallogic/training/j8/defaults/interfaces/DefaultInterfaceDemo.java
14. ● Sólo un método abstracto.
● Puede convertirse en una expresión lambda.
● Uno o más métodos “default”.
● Uno o más métodos estáticos.
● Predicate es un ejemplo de una Functional Interface incorporada en la JDK 1.8.
En algún momento trabajamos con alguna interface de tipo SAM (Single Abstract Method) como Runnable
Callable o ActionListener. @FunctionalInterface permite declarar interfaces de este tipo.
Functional Interfaces
Java Evolution - Java 8
</> Source code: com/globallogic/training/j8/functional/interfaces/PredicateDemo.java
15. Hay cuatro tipos de métodos que pueden ser referenciados:
● Métodos estáticos (Class::staticMethodName)
● Constructores
● Métodos de instancia de una clase específica
● Métodos de instancia de un objeto específco
Nos permite referenciar constructores y métodos sin ejecutarlos. Está fuertemente ligado con las lambda
expressions.
Method References
Java Evolution - Java 8
</> Source code: com/globallogic/training/j8/method/references/MethodReferencesDemo.java
16. ● Es un contenedor para evitar chequeos por nulls y fomentar la legibilidad del código
● Está basado en el Optional de Google Guava
● Usa generics para inferir el tipo
● Métodos màs comunes isPresent(), orElseGet() o map().orElse()
Características:
Optional
Java Evolution - Java 8
</> Source code: com/globallogic/training/j8/optionals/OptionalDemo.java
17. ● Simplifica el procesamiento de colecciones
● Complementa el soporte de Lambdas
● Permite paralelizar (en procesamiento), filtrar, mapear y convertir los elementos de la colección.
● No solo es útil para colecciones sino para el streaming de datos en archivos
● Define nuevos conceptos como ser: funciones de agregación y pipelines
● Métodos màs comunes son: mapTo*(), filter(), getAs*()
Características:
Stream API
Java Evolution - Java 8
</> Source code: com/globallogic/training/j8/collections/streams/StreamBasicDemo.java
18. Stream API: Reducción
Java Evolution - Java 8
Características:
</> Source code: com/globallogic/training/j8/collections/streams/StreamReduceDemo.java
● Las operaciones de reducción generalmente retornan un único valor (average, min, max, count)
● También existen aquellas que retornan colecciones (collect, reduce)
● La diferencia principal entre reduce() y collect() es que collect modifica o muta un valor existente,
reduce en cambio crea una nuevo.
19. New Date/Time API
Java Evolution - Java 8
Características:
● Para obtener la fecha o la hora actual ahora podemos usar la clase Clock, a través de sus métodos instant() o
millis()
● Nuevas clases solo para Date ó Time ó ambas (LocalDate, LocalTime o LocalDateTime)
● En el caso de requerir Time zone (ZonedDateTime)
● Posibilidad de “truncar” dates usando truncatedTo() y pasando como parametro la unidad ChronoUnit.*
● Diferencia entre dates en términos de duración a través de la clase Duration
● Los períodos representan una duración en tiempo. Por ejemplo: 3 meses, 2 días, 10 horas, 20 minutos y 10 seg.
● Nuevo modelo de Time zones cada una con set de reglas. Hay más facilidad para calcular diferencias horarias.
</> Source code: com/globallogic/training/j8/datetime/DateTimeDurationDemo.java
20. Nashorn: Javascript Engine
Java Evolution - Java 8
Características:
● Nuevo engine de Javascript (en la JDK7 existe uno basado en Mozilla Rhino): Mejor performance y
adaptación a ECMA JS
● Permite desarrollar aplicaciones de javascript usando como runtime la JVM
● También existe una tool (jjs) que permite ejecutar dichos scripts por consola
</> Source code: com/globallogic/training/j8/jsengine/NashornDemo.java
21. Parallel Arrays
Java Evolution - Java 8
Características:
● Provee mejor performance en las operaciones gracias a la utilización de los cores.
● Metodos agregados: parallelSort(), parallelSetAll(), parallelPrefix()
● Nueva interfaz Spliterator para recorrer y particionar arrays.
</> Source code: com/globallogic/training/j8/parallelArrays/ParallelSort.java
24. ● Modularización de la JDK.
● Facilita incorporar la JDK en dispositivos pequeños.
● Facilita y mejora la implementación de seguridad.
● Mejoras en la performance de las aplicaciones.
● Simplificación en el desarrollo de las aplicaciones.
● Al día de hoy se están incluyendo los siguientes
enhancements en la JDK 9
● JEP 201: Modular Source Code
● JEP 220: Modular Run-Time Images
● Se busca poder definir módulos como en el ejemplo.
Objetivo: modularización y optimización de la plataforma Java. Incluye JEPs 200, 201, 220 y JSR 376.
Proyecto Jigsaw
Java Evolution - Java 9
module M @ 1.0 {
requires A @ >= 2.0 ; // Version constraints
requires service S1;
provides MI @ 4.0;
provides service MS with C;
exports ME;
permits MF;
class MMain;
view N {
provides service NS with D;
class NMain;
}
}
25. ● Alternativa nativa y optimizada a librerias existentes como Jackson o Gson.
● JSON es el formato más utilizado para intercambiar información en la web.
● Se intenta proveer una API para las funcionalidades más comunes.
● Formará parte del package java.util
● Se dividirá en cuatro módulos: events, streams, trees y generators.
Objetivo: Proveer una API simple para consumir y generar JSON y streams.
Lightweight JSON API
Java Evolution - Java 9
26. ● Actualmente suele ser necesario utilizar código nativo para realizar ciertas operaciones.
● Obtener/asignar el nombre de un proceso.
● Obtener información de los procesos (similar al comando ps)
● Manejo de árboles de procesos y subprocesos.
● Obtener el PID de un proceso (sin manipular streams)
Objetivo: Mejorar la API para controlar e interactuar con procesos del sistema operativo.
Process API updates
Java Evolution - Java 9
</> Source code: com/globallogic/training/j9/process/ProcessDemo.java
27. ● La clase java.util.Currency sólo representa monedas (sin
soporte para cálculos ni conversiones).
● Los montos de dinero se representan con BigDecimal o
Double.
● Nuevas clases para representar valores de dinero y
moneda.
● Nuevas clases y operaciones para cálculos,
conversiones y formatos.
● Fuentes dispnibles en https://github.
com/JavaMoney/jsr354-ri
Objetivo: Proveer una API para representar y realizar operaciones vinculadas a manejo de dinero y moneda
de una forma clara y simple.
Money and Currency API
Java Evolution - Java 9
Gradle:
compile group: 'org.javamoney', name: 'moneta', version:
'0.9'
Maven:
<dependency>
<groupId>org.javamoney</groupId>
<artifactId>moneta</artifactId>
<version>0.9</version>
</dependency>
</> Source code: com/globallogic/training/j9/money/MoneyDemo.java
28. ● HTTP 2 Client: Define a new HTTP client API that implements HTTP/2 and WebSocket.
● REPL in Java: Provide a console to evaluate declarations, statements, and expressions.
● Segmented Code Cache: Divide the code cache into distinct segments in order to improve performance.
● Unified JVM Logging: Introduce a common logging system for all components of the JVM.
More expected features
Java Evolution - Java 9+