presentación java evolution - globallogic club

29
Java Evolution Junio 2015

Upload: globallogic-latinoamerica

Post on 13-Aug-2015

71 views

Category:

Technology


4 download

TRANSCRIPT

Java Evolution

Junio 2015

Java Evolution - Timeline

01 Quick overview of JDK 7 Features

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

}

02 New features introduced in JDK 8

● 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

03 Promises for the JDK 9

● 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+

CONFIDENTIAL©2013 GlobalLogic Inc.

Gracias!