presentación java evolution - globallogic club
TRANSCRIPT
Autoclosing - Try-with-resourcesJava 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
Fork/Join frameworkJava 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)}
Exception Multi-catchJava Evolution - Java 7
Desde Java 7
Antes de Java 7 Desde Java 7
try {
doSomething();
}
catch(Ex1 ex) {
handleException();
}
catch(Ex2 ex) {
handleException();
}
catch(Ex3 ex) {
handleException();
}
try {
doSomething();
}
catch(Ex1 | Ex2 ex) {
handleException();
}
catch(Ex3 | Ex4 ex) {
handleException();
}
</> Source code: com/globallogic/training/j7/exceptions/MultiCatchDemo.java
Type inference for genericsJava 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<>();
}
}
Antes de Java 7
Strings for switchsJava 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
}
● 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 ExpressionsJava Evolution - Java 8
Es la principal novedad de Java 8...pero que es el cálculo lambda ?
● 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 ExpressionsJava Evolution - Java 8
● 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 ExpressionsJava Evolution - Java 8
</> Source code: com/globallogic/training/j8/lambdas/*.java
● 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 MethodsJava Evolution - Java 8
</> Source code: com/globallogic/training/j8/defaults/interfaces/DefaultInterfaceDemo.java
● 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 InterfacesJava Evolution - Java 8
</> Source code: com/globallogic/training/j8/functional/interfaces/PredicateDemo.java
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 ReferencesJava Evolution - Java 8
</> Source code: com/globallogic/training/j8/method/references/MethodReferencesDemo.java
● 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
● 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
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.
New Date/Time APIJava 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
Nashorn: Javascript EngineJava 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
Parallel ArraysJava 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
Nuevas HerramientasJava Evolution - Java 8
Características:
● jdeps: analiza paquetes y dependencias a nivel de clase.
jdeps -v ClassName.class Deps.class -> /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar Deps (Deps.class) -> java.io.PrintStream -> java.lang.Math -> java.lang.Object -> java.lang.String -> java.lang.System -> java.util.HashSet
● jjs: nashorn engine
jjs greet.js
● 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 JigsawJava 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; }}
● 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 APIJava Evolution - Java 9
● 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 updatesJava Evolution - Java 9
</> Source code: com/globallogic/training/j9/process/ProcessDemo.java
● 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 APIJava 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
● 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 featuresJava Evolution - Java 9+