SlideShare a Scribd company logo
1 of 88
HackDay Java 9
Java 9 en nuestro idioma
Noviembre 25 - 2017
Nos acompañan
Perú JUG
Barcelona JUG
Nuestros invitados
Heather VanCura
Java Community Process
@heathervc
Mani Sarkar
Adopt Open JDK
@theNeomatrix369
Organizadores
Medellín JUG
Speakers
Hillmer Chona
Colombia
@hchona
David Gomez
España
@dgomezg
Mercedes Wyzz
Guatemala
@itrjwyss
Alberto Salazar
Ecuador
@betoSalazar
Agenda
- Adopta Open JDK
- Sesión 1: Introducción a Java 9
- Sesión 2: Java 9: Más allá de la modularización
- Java Community Process
- Receso (Media Mañana, Tiempo para un algo, media tarde, etc)
- Sesión 3: JShell
- Sesión 4: JLink
- Comentarios y retroalimentación (FeedBack)
Adopta Open JDK
15 Minutos
Mani Sarkar
Adopt Open JDK
@theNeomatrix369
Estamos listos para iniciar?
Java 9
http://jdk.java.net/9/
https://adoptopenjdk.net/releases.html
Repositorio GIT
https://github.com/AdoptOpenJDK/jdk9-jigsaw/tree/master/es
Sesión 1: Introducción a Java 9
15 Minutos
Hillmer Chona
Colombia
MedellinJUG
@hchona
Que significa modularización en Java 9
Sesión 1: Introducción a Java 9
Es la división del JDK en un conjunto de módulos que pueden ser combinados en
tiempos de ejecución, compilación, o construcción. Esto permite entender y definir
las dependencias entre módulos.
La modularidad permite a los desarrolladores de manera más fácil ensamblar y
mantener las aplicaciones. También permite a Java reducirse para poder ser
utilizadas en pequeños dispositivos mientras la seguridad y el rendimiento es
mejorado.
Que significa modularización en Java 9
Java, el lenguaje: Dividido en módulos Sesión 1: Introducción a Java 9
Que significa modularización en Java 9
Java, el lenguaje: Gráfico de dependencias
Sesión 1: Introducción a Java 9
Porque modularización en Java 9
Viene funcionando por cerca de una década
Configuración confiable
- Define dependencias entre módulos
- Resuelve problemas de ClassPath
Fuerte encapsulación
- Define o oculta lo que no es necesario que tenga acceso público
- JDK APIs internas (sun.misc.unsafe, security, etc…)
- APIs internas de nuestras aplicaciones
Sesión 1: Introducción a Java 9
Porque modularización en Java 9
Otros efectos y beneficios
- Permite remover lo que no necesitamos (bajo acoplamiento y alta cohesión)
- Runtime customizables
- Mejora la distribución y mejora el rendimiento de ejecución
- Altamente requerido para IoT, arduino/dispositivos embebidos, ect.
Sesión 1: Introducción a Java 9
Que significa modularización en Java 9
Antes Vs Despues de Java 9 Sesión 1: Introducción a Java 9
Que significa modularización en Java 9
Estructura de paquetes en disco Sesión 1: Introducción a Java 9
Que significa modularización en Java 9
Estructura de paquetes en disco Sesión 1: Introducción a Java 9
Modulo org.medellinjug.hobbies Paquete org.medellinjug.hobbies
Que significa modularización en Java 9
Definición de dependencias Sesión 1: Introducción a Java 9
module-info.java
Manos a la obra: Workshop sesión 1
60 Minutos
Sesión 1: Introducción a Java 9
Manos a la obra: Es tiempo de practicar
Sesión 1: Introducción a Java 9
Que necesitamos
- JDK 9 instalado y configurado
- Consola de comando: DOS, Terminal, Git Bash
- Opcional: Editor de texto, explorador de archivos
Manos a la obra: Es tiempo de practicar
https://github.com/AdoptOpenJDK/jdk9-jigsaw/tree/master/es
Sesión 1: Introducción a Java 9
Ejercicios a trabajar:
01, 02, 03, 04, 05 y 09
Manos a la obra: Es tiempo de practicar
es: directorio con archivo README con la
explicación en Español del ejercicio
src: directorio con los códigos fuentes de cada
taller
README.md: Archivo con la explicacioón en Inglés
Archivos .sh: Archivos que contienen los scripts
para compilar, empaquetar o ejecutar los talleres,
ejecutarlos en el orden que cada taller indica.
Revisarlos con un editor de texto para ver los
comandos que ejecuta cada uno
Sesión 1: Introducción a Java 9
Manos a la obra: Es tiempo de practicar
Sesión 1: Introducción a Java 9
Recuerde
No se trata de terminar todos los ejercicios o terminar de primero, la meta
es divertirnos, compartir (no sólo con los asistentes a nivel local, anímese a
compartir con los asistentes de las otras ciudades), colaborar, ayudar a
otros y pasar un buen rato
Sesión 2: Java 9: Más allá de la modularización
20 Minutos
Sesión 2: Java 9: Más allá de la modularización
20 Minutos
David Gomez
MadridJUG
España
@dgomezg
https://goo.gl/8W18mf
https://goo.gl/AroY8i
¿Qué nos ha traído Java 9?
¿Modularidad?
• Collections factory methods
• Interface changes
• Improvements in Optional<T>
• Stream enhancements
• Multi-release JAR files
• Reactive programming (Flow API)
• Stack Walking API
• New Deprecation
• try with resources improved
• REPL shell
• @safeVarArgs on private instance methods
• emoji in source code
• UTF-8 in property files
• G1 as default collector
• String changes (Compact strings, sharing
interned strings between JVMs)
• Unified JVM logging
• Spin-Wait hints
• VarHandles & Method Handles
Java 9 trae un montón de cosas
$java
WARNING: --permit-illegal-access will
be removed in the next major release
--illegal-access=--permit-illegal-accessdenypermitwarndebug
Jigsaw. Deshabilitar el control de acceso
Java 9: Más allá de la modularización
Colecciones
List<String> numbers = Arrays.asList("UNO", "DOS", "TRES");
List<Contact> contacts = new ArrayList<>();
contacts.add(new Contact("David", "Madrid", "555-55 55 55", LocalDate.of(1975, Month.MARCH, 26)));
contacts.add(new Contact("Nando", "Malaga", "555-55 55 56", LocalDate.of(1980, Month.APRIL, 30)));
contacts.add(new Contact("Hilmer", "Medellin", "555-75 44 63", LocalDate.of(1983, Month.JUNE, 29)));
contacts.add(new Contact("Antón", "Vigo", "555-66 66 73", LocalDate.of(1979, Month.SEPTEMBER, 7)));
contacts.add(new Contact("Olivier", "Paris", "555-66 66 61", LocalDate.of(1977, Month.DECEMBER, 22)));
*Crear e inicializar una lista en Java < 9
public final List<String> divisibleBy4 =
List.of("CUATRO", "OCHO", "DOCE", "DIECISEIS");
public final Map<String, Integer> numbers = Map.of(
"UNO", 1,
"DOS", 2,
"TRES", 3);
public final Set<Integer> negative = Set.of(-1,-2,-3);
9Java 9 Factory Methods. Colecciones
Collection Factory Methods. Características
static <E> Set<E> of() {}
static <E> Set<E> of(E e1) {}
static <E> Set<E> of(E e1, E e2) {}
static <E> Set<E> of(E e1, E e2, E e3) {}
[…]
static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5,
E e6, E e7, E e8, E e9, E e10) { }
static <E> Set<E> of(E... elements) {}
Métodos sobre cargados de 0 a 10 elementos
9
static <E> Set<E> of(E e1, E e2, E e3) {
return new ImmutableCollections.SetN<>(e1, e2, e3);
}
Collection Factory Methods. Características 9
Colecciones inmutables
static <E> Set<E> of() {
return ImmutableCollections.Set0.instance();
}
Collection Factory Methods. Características
Reutiliza colecciones vacías
9
static <E> Set<E> of() {
return ImmutableCollections.Set0.instance();
}
static <E> Set<E> of(E e1) {
return new ImmutableCollections.Set1<>(e1);
}
static <E> Set<E> of(E e1, E e2) {
return new ImmutableCollections.Set2<>(e1, e2);
}
static <E> Set<E> of(E e1, E e2, E e3) {
return new ImmutableCollections.SetN<>(e1, e2, e3);
}
Collection Factory Methods. Características
Implementaciones específicas para 0, 1, 2 & N elementos
9
static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2) {
return new ImmutableCollections.MapN<>(k1, v1, k2, v2);
}
Map<String, Integer> numbers = Map.of("UNO", 1,"DOS", 2);
static <K, V> Map<K, V> ofEntries(Entry<K,V>... entries) { }
Collection Factory Methods. Características
Oculta la estructura del Entry para Mapas
9
(Sólo para mapas de menos de 10 elementos)
Java 9: Más allá de la modularización
Interfaces
(Milling coin project)
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
Interfaces. Métodos por defecto (Java 8)
Extensión de contratos (sin romper implementaciones)
Conversión de interfaces complejos en @FunctionaInterfaces
8
public interface Locatable {
GeoPoint getLocation();
default boolean isInside(GeoPoint... points) {
//compose a polygon from points[]
return;
}
default boolean isInBorder(int borderSize, GeoPoint... points) {
//compose a poligon from points[]
//check if distance from getLocation to any edge is less than borderSize
return;
}
}
Java 9 Interfaces. Métodos privados.
8
public interface Locatable {
GeoPoint getLocation();
default boolean isInside(GeoPoint... points) {
//compose a polygon from points[]
return;
}
default boolean isInBorder(int borderSize, GeoPoint... points) {
//compose a poligon from points[]
//check if distance from getLocation to any edge is less than borderSize
return;
}
private Poligon getPoligonFrom(GeoPoint... points) {
return new Poligon();
}
}
Java 9 Interfaces. Métodos privados.
8
public interface Locatable {
GeoPoint getLocation();
default boolean isInside(GeoPoint... points) {
//compose a polygon from points[]
getPoligonFrom(points);
return;
}
default boolean isInBorder(int borderSize, GeoPoint... points) {
//compose a poligon from points[]
getPoligonFrom(points);
//check if distance from getLocation to any edge is less than borderSize
return;
}
private Poligon getPoligonFrom(GeoPoint... points) {
return new Poligon();
}
}
Java 9 Interfaces. Métodos privados.
9
Java 9 Interfaces. Métodos privados. Ventajas
Reutilización de código en métodos de extensión
Mantiene el código limpio
Expone sólo el API público del interfaz
Java 9: Más allá de la modularización
Mejoras en Optional
Optional. Más popular de lo que se esperaba
Pensado inicialmente como tipo de retorno para métodos.
The JSR-335 EG felt fairly strongly that Optional should not be
on any more than needed to support the optional-return idiom
only.
Someone suggested maybe even renaming it to OptionalReturn
Optional. Más popular de lo que se esperaba
Adecuado en ciertos casos, pero:
No pensado como contenedor de atributos
No como argumento de un método
No para evitar el NullPointerException
Optional. The mother of all bikesheeds
https://goo.gl/i13Cu4
Optional. Casos de uso
public class Contact implements Comparable<Contact> {
private String name;
private String city;
private String phoneNumber;
private boolean emergency = false;
} public class ContactBook extends ArrayList<Contact> {
public Optional<Contact> getEmergency() {
return this.getFirstThat(Contact::isEmergency);
}
public Optional<Contact> getFirstContactFromCity(String city) {
return getFirstThat(c -> c.getCity().equalsIgnoreCase(city));
}
private Optional<Contact> getFirstThat(Predicate<Contact> predicate) {
return this.stream().filter(predicate).findFirst();
}
}
Optional<Contact> emergencyCall = contactBook.getEmergency();
if (emergencyCall.isPresent()) {
emergencyCall.get().getPhoneNumber();
}
Contact emergencyCall = contactBook.getEmergency();
if (emergencyCall != null) {
emergencyCall.getPhoneNumber();
}
Optional. Uso NO preferido
get() para el valor (¡Cuidado! ¡puede lanzar NoSuchElementException)
Usar isPresent() para comprobar el valor
¿No se parece eso a la comprobación de nulos?
Optional. Uso recomendado
Mejor utilizar ifPresent(Consumer<T>)
contactBook.getEmergency()
.ifPresent(contact -> new PhoneDialer().dial(contact));
Optional. Mejoras en Java 9. ifPresentOrElse
Recibe
Un Consumer<T> (invocado cuando hay valor)
Y un Runnable (invocado cuando no hay valor)
emergencyCall.ifPresentOrElse(
contact -> phoneDialer.dial(contact),
() -> phoneDialer.dial("112"));
Optional. orElseGet (Java 8)
Recibe un Supplier<T> (invocado cuando no hay valor)
La legilibilidad puede mejorarse
8
Contact emergencies = new Contact("Emergencies", "Spain", "112");
String emergencyNumber =
emergencyCall.orElseGet(() -> emergencies)
.getPhoneNumber();
phoneDialer.dial(emergencyNumber);
Permite retornar un valor por defecto
Optional. Más legible en Java 9 con or()
Recibe un Supplier<Optional<T>>
9
or() crea un Optional<T> que contiene el valor por defecto
Contact emergencies = new Contact("Emergencies", "Spain", "112");
Optional<String> emergencyNumber =
contactBook.getEmergency()
.or(()->Optional.of(emergencies)
phoneDialer.dial(emergencyNumber.get());
Optional. Stream<Optional<T>>
Hay que gestionar específicamente el isPresent() y el get()
8
Llamar a un contacto de cada ciudad cercana
ciudadesCercanas.stream()
.map(contactBook::getFirstContactFromCity)
//now we have Stream<Optional<Contact>>
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(phoneDialer::dial);
Optional. Java 9 Optional.stream()
Optional.stream() retorna un stream de 0 o 1 elementos
Usaremos flatMap() para aplanarlo
9
Llamar a un contacto de cada ciudad cercana
ciudadesCercanas.stream()
.map(contactBook::getFirstContactFromCity)
.flatMap(Optional::stream)
.forEach(phoneDialer::dial);
Java 9: Más allá de la modularización
Mejoras en Streams
Stream. takeWhile()
Nos permite parar streams infinitos
9
Útil para cortar el procesamiento ante una condición externa
Files.lines(Paths.get("urls.txt"))
.takeWhile(__ -> running)
.forEach(url -> URLChecker::check);
Stream. dropWhile()
9
Útil para cortar el procesamiento ante una condición externa
Files.lines(Paths.get("urls.txt"))
.dropWhile(__ -> !running)
.forEach(url -> URLChecker::check);
Stream. Método iterate() enriquecido
¡Cuidado con operaciones como: sort(), max()...!
9
iterate() devuelve Streams infinitos
IntStream infiniteEvenNumbers = IntStream.iterate(0, i -> i+2);
IntStream evenNumbers = IntStream.iterate(0, i -> i < 500, i -> i+2);
IntStream evenNumbers = IntStream.iterate(0, __ -> running, i -> i+2);
Alternativa con el formato iterate(seed, hasNext, getNext)
Stream. Método de factoría ofNullable()
9
Crea un stream vacío cuando el valor es null
/**
* Returns a sequential {@code Stream} containing a single element, if
* non-null, otherwise returns an empty {@code Stream}.
*
* @param t the single element
* @param <T> the type of stream elements
* @return a stream with a single element if the specified element
* is non-null, otherwise an empty stream
* @since 9
*/
public static<T> Stream<T> ofNullable(T t) {
return t == null ? Stream.empty()
: StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Java 9: Más allá de la modularización
Otros cambios más alla
de la modularización
• MultiRelease Jar files
• Flow API (estándar para sistemas reactivos)
• StackWalking
• Nuevo parametro en @Deprecated
• VarHandles
• Cambios internos en String
Y la lista sigue...
• @SafeVarArgs on private instance methods
• emoji in source code
• UTF-8 in property files
• _ not allowed as identifier
• Unified JVM logging
• Spin-Wait hints
… Y sigue ...
// This comment is 💩
… Y sigue ...
El JCP nos Saluda
Heather VanCura, Mercedes Wyss
Receso (Media Mañana, Tiempo para el algo, media tarde)
25 Minutos
Sesión1: Introducción a Java 9
Sesión 3: JShell
15 Minutos
Mercedes Wyzz
Guatemala
@itrjwyss
Java Shell Tool
● REPL (Read-Evaluate-Print Loop)
● Aprender Java
● Prototipar Código Java
https://docs.oracle.com/javase/9/jshell/toc.htm
Sesión 3: JShell
Inicializando JShell
Sesión 3: JShell
Verbose mode Normal mode
$ jshell -v $ jshell
| Welcome to JShell -- Version 9-internal
| For an introduction type: /help intro
jshell>
Diferencia del Modo
Sesión 3: JShell
Verbose mode Normal mode
int x = 6;
x ==> 6
| created variable x : int
jshell> int x = 6;
x ==> 6
Snippets
● Sentencias
● Variables
● Métodos
Sesión 3: JShell
● Clases
● Imports
● Expresiones
Sentencias
Sesión 3: JShell
jshell> 5 + 16 * 3
$1 ==> 53
| created scratch variable $1 : int
Variables
Sesión 3: JShell
jshell> int x = 24
x ==> 24
| created variable x : int
jshell> String str = "Ejemplo"
str ==> "Ejemplo"
| created variable str : String
Métodos
Sesión 3: JShell
jshell> void asteriscos(int n){
...> for(int i = 1; i <= n; i++){
...> for(int j = 0; j < i; j++){
...> System.out.print("*");
...> }
...> System.out.println();
...> }
...> }
| created method asteriscos(int)
Métodos
Sesión 3: JShell
jshell> asteriscos(4)
*
**
***
****
Clases
Sesión 3: JShell
jshell> class Ejemplo {
...> public void sayHi(){
...> System.out.println("Hola!!!");
...> }
...> }
| created class Ejemplo
Clases
Sesión 3: JShell
jshell> Ejemplo ejemplo = new Ejemplo()
ejemplo ==> Ejemplo@4dfa3a9d
jshell> ejemplo.sayHi()
Hola!!!
Cambio de Definiciones
Sesión 3: JShell
jshell> int elevar(int n){ return n * n;}
| created method elevar(int)
jshell> elevar(4);
$9 ==> 16
Cambio de Definiciones
Sesión 3: JShell
jshell> int elevar(int n){ return n * n * n;}
| modified method elevar(int)
jshell> elevar(4)
$11 ==> 64
Comandos
● /vars
● /methods
● /open
Sesión 3: JShell
● /help
● /exit
● /save
● /list
○ -all
○ -history
○ -start
○ -<tab>
/save
Sesión 3: JShell
jshell> /save [-all|-history|-start] <file>
jshell> /save -all HackatonOpenJDK.java
/open
Sesión 3: JShell
jshell> /open <file>
jshell> /open HackatonOpenJDK.java
Manos a la obra: Es tiempo de practicar
https://github.com/AdoptOpenJDK/jdk9-jigsaw/tree/master/session-3-jshell
Sesión 2: JShell
Manos a la obra: Como nos fué (feedback)
10 Minutos
Sesión 2: JShell
Sesión 4: Introducción a JLink
5 Minutos
Alberto Salazar
Ecuador
@betoSalazar
Sesión 4: Introducción a JLink
Pre-Java 9
Sesión 3: JLink
Applicacion:
Paquetes &
Clases
JDK (javac)
Paquete
(Distribuible)
Compila
r Creamo
s
Crear y empaquetar nuestro
artefacto, que corre donde
quiera, pero necesita una
plataforma específica JDK
Depende
o necesita
Para correr JVM (the
Platform)
Java, el
lenguaje
(Packages &
Clases)
Sesión 4: Introducción a JLink
Java 9
Sesión 3: JLink
Creamo
s
Crear un aplicación
standalone distribuible
(smaller footprint), que corre
en una plataforma específica
JVM, the Platform
Java, el lenguaje (JDK
modules)
JDK
Nuestra
Applicacion:
Módulos
Compila
JDK:
Módulos
JLink
Aplicacion (App modules)
Manos a la obra: Es tiempo de practicar
https://github.com/AdoptOpenJDK/jdk9-jigsaw/tree/master/session-2-jlink
Sesión 3: JLink
30 Minutos
Manos a la obra: Como nos fué (feedback)
10 Minutos
Sesión 3: JLink

More Related Content

Similar to Java 9 HackDay: Introducción a Java 9

Buildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en PythonBuildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en PythonCodeSyntax
 
instrumentos de trabajo
instrumentos de trabajoinstrumentos de trabajo
instrumentos de trabajojorpical
 
Ejerciciosparaelprimerparcial
EjerciciosparaelprimerparcialEjerciciosparaelprimerparcial
Ejerciciosparaelprimerparcialmtemarialuisa
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaAndres Almiray
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradleDavid Gómez García
 
JRuby: Ruby en un mundo enterprise
JRuby: Ruby en un mundo enterpriseJRuby: Ruby en un mundo enterprise
JRuby: Ruby en un mundo enterpriseJano González
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...Plain Concepts
 
Clean Code (EN ESPANOL)
Clean Code (EN ESPANOL)Clean Code (EN ESPANOL)
Clean Code (EN ESPANOL)Rodrigo Branas
 
Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones web
Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones webGroovy&Grails: Cambia la forma de desarrollar tus aplicaciones web
Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones webParadigma Digital
 
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grailsCambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grailsFátima Casaú Pérez
 
Primeros pasos con java 9
Primeros pasos con java 9Primeros pasos con java 9
Primeros pasos con java 9Eudris Cabrera
 
Entornodedesarrollodejava
EntornodedesarrollodejavaEntornodedesarrollodejava
EntornodedesarrollodejavaVictor Zapata
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterAdolfo Sanz De Diego
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaSoftware Guru
 
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
 

Similar to Java 9 HackDay: Introducción a Java 9 (20)

Buildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en PythonBuildout: Crear y desplegar entornos reproducibles en Python
Buildout: Crear y desplegar entornos reproducibles en Python
 
instrumentos de trabajo
instrumentos de trabajoinstrumentos de trabajo
instrumentos de trabajo
 
Ejerciciosparaelprimerparcial
EjerciciosparaelprimerparcialEjerciciosparaelprimerparcial
Ejerciciosparaelprimerparcial
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
 
Jano Gonzalez - jruby
Jano Gonzalez - jrubyJano Gonzalez - jruby
Jano Gonzalez - jruby
 
JRuby: Ruby en un mundo enterprise
JRuby: Ruby en un mundo enterpriseJRuby: Ruby en un mundo enterprise
JRuby: Ruby en un mundo enterprise
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Taller girona
Taller gironaTaller girona
Taller girona
 
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a...
 
Clean Code (EN ESPANOL)
Clean Code (EN ESPANOL)Clean Code (EN ESPANOL)
Clean Code (EN ESPANOL)
 
Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones web
Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones webGroovy&Grails: Cambia la forma de desarrollar tus aplicaciones web
Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones web
 
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grailsCambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
 
Primeros pasos con java 9
Primeros pasos con java 9Primeros pasos con java 9
Primeros pasos con java 9
 
Entornodedesarrollodejava
EntornodedesarrollodejavaEntornodedesarrollodejava
Entornodedesarrollodejava
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipster
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficacia
 
Microservicios con Quarkus
Microservicios con QuarkusMicroservicios con Quarkus
Microservicios con Quarkus
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 

Recently uploaded

Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
ejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofJuancarlosHuertasNio1
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...AlanCedillo9
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...JaquelineJuarez15
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 

Recently uploaded (20)

Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
ejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sof
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 

Java 9 HackDay: Introducción a Java 9

  • 1. HackDay Java 9 Java 9 en nuestro idioma Noviembre 25 - 2017
  • 3. Nuestros invitados Heather VanCura Java Community Process @heathervc Mani Sarkar Adopt Open JDK @theNeomatrix369
  • 5. Speakers Hillmer Chona Colombia @hchona David Gomez España @dgomezg Mercedes Wyzz Guatemala @itrjwyss Alberto Salazar Ecuador @betoSalazar
  • 6. Agenda - Adopta Open JDK - Sesión 1: Introducción a Java 9 - Sesión 2: Java 9: Más allá de la modularización - Java Community Process - Receso (Media Mañana, Tiempo para un algo, media tarde, etc) - Sesión 3: JShell - Sesión 4: JLink - Comentarios y retroalimentación (FeedBack)
  • 7. Adopta Open JDK 15 Minutos Mani Sarkar Adopt Open JDK @theNeomatrix369
  • 8. Estamos listos para iniciar? Java 9 http://jdk.java.net/9/ https://adoptopenjdk.net/releases.html Repositorio GIT https://github.com/AdoptOpenJDK/jdk9-jigsaw/tree/master/es
  • 9. Sesión 1: Introducción a Java 9 15 Minutos Hillmer Chona Colombia MedellinJUG @hchona
  • 10. Que significa modularización en Java 9 Sesión 1: Introducción a Java 9 Es la división del JDK en un conjunto de módulos que pueden ser combinados en tiempos de ejecución, compilación, o construcción. Esto permite entender y definir las dependencias entre módulos. La modularidad permite a los desarrolladores de manera más fácil ensamblar y mantener las aplicaciones. También permite a Java reducirse para poder ser utilizadas en pequeños dispositivos mientras la seguridad y el rendimiento es mejorado.
  • 11. Que significa modularización en Java 9 Java, el lenguaje: Dividido en módulos Sesión 1: Introducción a Java 9
  • 12. Que significa modularización en Java 9 Java, el lenguaje: Gráfico de dependencias Sesión 1: Introducción a Java 9
  • 13. Porque modularización en Java 9 Viene funcionando por cerca de una década Configuración confiable - Define dependencias entre módulos - Resuelve problemas de ClassPath Fuerte encapsulación - Define o oculta lo que no es necesario que tenga acceso público - JDK APIs internas (sun.misc.unsafe, security, etc…) - APIs internas de nuestras aplicaciones Sesión 1: Introducción a Java 9
  • 14. Porque modularización en Java 9 Otros efectos y beneficios - Permite remover lo que no necesitamos (bajo acoplamiento y alta cohesión) - Runtime customizables - Mejora la distribución y mejora el rendimiento de ejecución - Altamente requerido para IoT, arduino/dispositivos embebidos, ect. Sesión 1: Introducción a Java 9
  • 15. Que significa modularización en Java 9 Antes Vs Despues de Java 9 Sesión 1: Introducción a Java 9
  • 16. Que significa modularización en Java 9 Estructura de paquetes en disco Sesión 1: Introducción a Java 9
  • 17. Que significa modularización en Java 9 Estructura de paquetes en disco Sesión 1: Introducción a Java 9 Modulo org.medellinjug.hobbies Paquete org.medellinjug.hobbies
  • 18. Que significa modularización en Java 9 Definición de dependencias Sesión 1: Introducción a Java 9 module-info.java
  • 19. Manos a la obra: Workshop sesión 1 60 Minutos Sesión 1: Introducción a Java 9
  • 20. Manos a la obra: Es tiempo de practicar Sesión 1: Introducción a Java 9 Que necesitamos - JDK 9 instalado y configurado - Consola de comando: DOS, Terminal, Git Bash - Opcional: Editor de texto, explorador de archivos
  • 21. Manos a la obra: Es tiempo de practicar https://github.com/AdoptOpenJDK/jdk9-jigsaw/tree/master/es Sesión 1: Introducción a Java 9 Ejercicios a trabajar: 01, 02, 03, 04, 05 y 09
  • 22. Manos a la obra: Es tiempo de practicar es: directorio con archivo README con la explicación en Español del ejercicio src: directorio con los códigos fuentes de cada taller README.md: Archivo con la explicacioón en Inglés Archivos .sh: Archivos que contienen los scripts para compilar, empaquetar o ejecutar los talleres, ejecutarlos en el orden que cada taller indica. Revisarlos con un editor de texto para ver los comandos que ejecuta cada uno Sesión 1: Introducción a Java 9
  • 23. Manos a la obra: Es tiempo de practicar Sesión 1: Introducción a Java 9 Recuerde No se trata de terminar todos los ejercicios o terminar de primero, la meta es divertirnos, compartir (no sólo con los asistentes a nivel local, anímese a compartir con los asistentes de las otras ciudades), colaborar, ayudar a otros y pasar un buen rato
  • 24. Sesión 2: Java 9: Más allá de la modularización 20 Minutos
  • 25. Sesión 2: Java 9: Más allá de la modularización 20 Minutos David Gomez MadridJUG España @dgomezg https://goo.gl/8W18mf https://goo.gl/AroY8i
  • 26. ¿Qué nos ha traído Java 9? ¿Modularidad?
  • 27. • Collections factory methods • Interface changes • Improvements in Optional<T> • Stream enhancements • Multi-release JAR files • Reactive programming (Flow API) • Stack Walking API • New Deprecation • try with resources improved • REPL shell • @safeVarArgs on private instance methods • emoji in source code • UTF-8 in property files • G1 as default collector • String changes (Compact strings, sharing interned strings between JVMs) • Unified JVM logging • Spin-Wait hints • VarHandles & Method Handles Java 9 trae un montón de cosas
  • 28. $java WARNING: --permit-illegal-access will be removed in the next major release --illegal-access=--permit-illegal-accessdenypermitwarndebug Jigsaw. Deshabilitar el control de acceso
  • 29. Java 9: Más allá de la modularización Colecciones
  • 30. List<String> numbers = Arrays.asList("UNO", "DOS", "TRES"); List<Contact> contacts = new ArrayList<>(); contacts.add(new Contact("David", "Madrid", "555-55 55 55", LocalDate.of(1975, Month.MARCH, 26))); contacts.add(new Contact("Nando", "Malaga", "555-55 55 56", LocalDate.of(1980, Month.APRIL, 30))); contacts.add(new Contact("Hilmer", "Medellin", "555-75 44 63", LocalDate.of(1983, Month.JUNE, 29))); contacts.add(new Contact("Antón", "Vigo", "555-66 66 73", LocalDate.of(1979, Month.SEPTEMBER, 7))); contacts.add(new Contact("Olivier", "Paris", "555-66 66 61", LocalDate.of(1977, Month.DECEMBER, 22))); *Crear e inicializar una lista en Java < 9
  • 31. public final List<String> divisibleBy4 = List.of("CUATRO", "OCHO", "DOCE", "DIECISEIS"); public final Map<String, Integer> numbers = Map.of( "UNO", 1, "DOS", 2, "TRES", 3); public final Set<Integer> negative = Set.of(-1,-2,-3); 9Java 9 Factory Methods. Colecciones
  • 32. Collection Factory Methods. Características static <E> Set<E> of() {} static <E> Set<E> of(E e1) {} static <E> Set<E> of(E e1, E e2) {} static <E> Set<E> of(E e1, E e2, E e3) {} […] static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) { } static <E> Set<E> of(E... elements) {} Métodos sobre cargados de 0 a 10 elementos 9
  • 33. static <E> Set<E> of(E e1, E e2, E e3) { return new ImmutableCollections.SetN<>(e1, e2, e3); } Collection Factory Methods. Características 9 Colecciones inmutables
  • 34. static <E> Set<E> of() { return ImmutableCollections.Set0.instance(); } Collection Factory Methods. Características Reutiliza colecciones vacías 9
  • 35. static <E> Set<E> of() { return ImmutableCollections.Set0.instance(); } static <E> Set<E> of(E e1) { return new ImmutableCollections.Set1<>(e1); } static <E> Set<E> of(E e1, E e2) { return new ImmutableCollections.Set2<>(e1, e2); } static <E> Set<E> of(E e1, E e2, E e3) { return new ImmutableCollections.SetN<>(e1, e2, e3); } Collection Factory Methods. Características Implementaciones específicas para 0, 1, 2 & N elementos 9
  • 36. static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2); } Map<String, Integer> numbers = Map.of("UNO", 1,"DOS", 2); static <K, V> Map<K, V> ofEntries(Entry<K,V>... entries) { } Collection Factory Methods. Características Oculta la estructura del Entry para Mapas 9 (Sólo para mapas de menos de 10 elementos)
  • 37. Java 9: Más allá de la modularización Interfaces (Milling coin project)
  • 38. public interface Iterable<T> { Iterator<T> iterator(); default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); } } Interfaces. Métodos por defecto (Java 8) Extensión de contratos (sin romper implementaciones) Conversión de interfaces complejos en @FunctionaInterfaces 8
  • 39. public interface Locatable { GeoPoint getLocation(); default boolean isInside(GeoPoint... points) { //compose a polygon from points[] return; } default boolean isInBorder(int borderSize, GeoPoint... points) { //compose a poligon from points[] //check if distance from getLocation to any edge is less than borderSize return; } } Java 9 Interfaces. Métodos privados. 8
  • 40. public interface Locatable { GeoPoint getLocation(); default boolean isInside(GeoPoint... points) { //compose a polygon from points[] return; } default boolean isInBorder(int borderSize, GeoPoint... points) { //compose a poligon from points[] //check if distance from getLocation to any edge is less than borderSize return; } private Poligon getPoligonFrom(GeoPoint... points) { return new Poligon(); } } Java 9 Interfaces. Métodos privados. 8
  • 41. public interface Locatable { GeoPoint getLocation(); default boolean isInside(GeoPoint... points) { //compose a polygon from points[] getPoligonFrom(points); return; } default boolean isInBorder(int borderSize, GeoPoint... points) { //compose a poligon from points[] getPoligonFrom(points); //check if distance from getLocation to any edge is less than borderSize return; } private Poligon getPoligonFrom(GeoPoint... points) { return new Poligon(); } } Java 9 Interfaces. Métodos privados. 9
  • 42. Java 9 Interfaces. Métodos privados. Ventajas Reutilización de código en métodos de extensión Mantiene el código limpio Expone sólo el API público del interfaz
  • 43. Java 9: Más allá de la modularización Mejoras en Optional
  • 44. Optional. Más popular de lo que se esperaba Pensado inicialmente como tipo de retorno para métodos. The JSR-335 EG felt fairly strongly that Optional should not be on any more than needed to support the optional-return idiom only. Someone suggested maybe even renaming it to OptionalReturn
  • 45. Optional. Más popular de lo que se esperaba Adecuado en ciertos casos, pero: No pensado como contenedor de atributos No como argumento de un método No para evitar el NullPointerException
  • 46. Optional. The mother of all bikesheeds https://goo.gl/i13Cu4
  • 47. Optional. Casos de uso public class Contact implements Comparable<Contact> { private String name; private String city; private String phoneNumber; private boolean emergency = false; } public class ContactBook extends ArrayList<Contact> { public Optional<Contact> getEmergency() { return this.getFirstThat(Contact::isEmergency); } public Optional<Contact> getFirstContactFromCity(String city) { return getFirstThat(c -> c.getCity().equalsIgnoreCase(city)); } private Optional<Contact> getFirstThat(Predicate<Contact> predicate) { return this.stream().filter(predicate).findFirst(); } }
  • 48. Optional<Contact> emergencyCall = contactBook.getEmergency(); if (emergencyCall.isPresent()) { emergencyCall.get().getPhoneNumber(); } Contact emergencyCall = contactBook.getEmergency(); if (emergencyCall != null) { emergencyCall.getPhoneNumber(); } Optional. Uso NO preferido get() para el valor (¡Cuidado! ¡puede lanzar NoSuchElementException) Usar isPresent() para comprobar el valor ¿No se parece eso a la comprobación de nulos?
  • 49. Optional. Uso recomendado Mejor utilizar ifPresent(Consumer<T>) contactBook.getEmergency() .ifPresent(contact -> new PhoneDialer().dial(contact));
  • 50. Optional. Mejoras en Java 9. ifPresentOrElse Recibe Un Consumer<T> (invocado cuando hay valor) Y un Runnable (invocado cuando no hay valor) emergencyCall.ifPresentOrElse( contact -> phoneDialer.dial(contact), () -> phoneDialer.dial("112"));
  • 51. Optional. orElseGet (Java 8) Recibe un Supplier<T> (invocado cuando no hay valor) La legilibilidad puede mejorarse 8 Contact emergencies = new Contact("Emergencies", "Spain", "112"); String emergencyNumber = emergencyCall.orElseGet(() -> emergencies) .getPhoneNumber(); phoneDialer.dial(emergencyNumber); Permite retornar un valor por defecto
  • 52. Optional. Más legible en Java 9 con or() Recibe un Supplier<Optional<T>> 9 or() crea un Optional<T> que contiene el valor por defecto Contact emergencies = new Contact("Emergencies", "Spain", "112"); Optional<String> emergencyNumber = contactBook.getEmergency() .or(()->Optional.of(emergencies) phoneDialer.dial(emergencyNumber.get());
  • 53. Optional. Stream<Optional<T>> Hay que gestionar específicamente el isPresent() y el get() 8 Llamar a un contacto de cada ciudad cercana ciudadesCercanas.stream() .map(contactBook::getFirstContactFromCity) //now we have Stream<Optional<Contact>> .filter(Optional::isPresent) .map(Optional::get) .forEach(phoneDialer::dial);
  • 54. Optional. Java 9 Optional.stream() Optional.stream() retorna un stream de 0 o 1 elementos Usaremos flatMap() para aplanarlo 9 Llamar a un contacto de cada ciudad cercana ciudadesCercanas.stream() .map(contactBook::getFirstContactFromCity) .flatMap(Optional::stream) .forEach(phoneDialer::dial);
  • 55. Java 9: Más allá de la modularización Mejoras en Streams
  • 56. Stream. takeWhile() Nos permite parar streams infinitos 9 Útil para cortar el procesamiento ante una condición externa Files.lines(Paths.get("urls.txt")) .takeWhile(__ -> running) .forEach(url -> URLChecker::check);
  • 57. Stream. dropWhile() 9 Útil para cortar el procesamiento ante una condición externa Files.lines(Paths.get("urls.txt")) .dropWhile(__ -> !running) .forEach(url -> URLChecker::check);
  • 58. Stream. Método iterate() enriquecido ¡Cuidado con operaciones como: sort(), max()...! 9 iterate() devuelve Streams infinitos IntStream infiniteEvenNumbers = IntStream.iterate(0, i -> i+2); IntStream evenNumbers = IntStream.iterate(0, i -> i < 500, i -> i+2); IntStream evenNumbers = IntStream.iterate(0, __ -> running, i -> i+2); Alternativa con el formato iterate(seed, hasNext, getNext)
  • 59. Stream. Método de factoría ofNullable() 9 Crea un stream vacío cuando el valor es null /** * Returns a sequential {@code Stream} containing a single element, if * non-null, otherwise returns an empty {@code Stream}. * * @param t the single element * @param <T> the type of stream elements * @return a stream with a single element if the specified element * is non-null, otherwise an empty stream * @since 9 */ public static<T> Stream<T> ofNullable(T t) { return t == null ? Stream.empty() : StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false); }
  • 60. Java 9: Más allá de la modularización Otros cambios más alla de la modularización
  • 61. • MultiRelease Jar files • Flow API (estándar para sistemas reactivos) • StackWalking • Nuevo parametro en @Deprecated • VarHandles • Cambios internos en String Y la lista sigue...
  • 62. • @SafeVarArgs on private instance methods • emoji in source code • UTF-8 in property files • _ not allowed as identifier • Unified JVM logging • Spin-Wait hints … Y sigue ... // This comment is 💩
  • 63. … Y sigue ...
  • 64. El JCP nos Saluda Heather VanCura, Mercedes Wyss
  • 65. Receso (Media Mañana, Tiempo para el algo, media tarde) 25 Minutos Sesión1: Introducción a Java 9
  • 66. Sesión 3: JShell 15 Minutos Mercedes Wyzz Guatemala @itrjwyss
  • 67. Java Shell Tool ● REPL (Read-Evaluate-Print Loop) ● Aprender Java ● Prototipar Código Java https://docs.oracle.com/javase/9/jshell/toc.htm Sesión 3: JShell
  • 68. Inicializando JShell Sesión 3: JShell Verbose mode Normal mode $ jshell -v $ jshell | Welcome to JShell -- Version 9-internal | For an introduction type: /help intro jshell>
  • 69. Diferencia del Modo Sesión 3: JShell Verbose mode Normal mode int x = 6; x ==> 6 | created variable x : int jshell> int x = 6; x ==> 6
  • 70. Snippets ● Sentencias ● Variables ● Métodos Sesión 3: JShell ● Clases ● Imports ● Expresiones
  • 71. Sentencias Sesión 3: JShell jshell> 5 + 16 * 3 $1 ==> 53 | created scratch variable $1 : int
  • 72. Variables Sesión 3: JShell jshell> int x = 24 x ==> 24 | created variable x : int jshell> String str = "Ejemplo" str ==> "Ejemplo" | created variable str : String
  • 73. Métodos Sesión 3: JShell jshell> void asteriscos(int n){ ...> for(int i = 1; i <= n; i++){ ...> for(int j = 0; j < i; j++){ ...> System.out.print("*"); ...> } ...> System.out.println(); ...> } ...> } | created method asteriscos(int)
  • 74. Métodos Sesión 3: JShell jshell> asteriscos(4) * ** *** ****
  • 75. Clases Sesión 3: JShell jshell> class Ejemplo { ...> public void sayHi(){ ...> System.out.println("Hola!!!"); ...> } ...> } | created class Ejemplo
  • 76. Clases Sesión 3: JShell jshell> Ejemplo ejemplo = new Ejemplo() ejemplo ==> Ejemplo@4dfa3a9d jshell> ejemplo.sayHi() Hola!!!
  • 77. Cambio de Definiciones Sesión 3: JShell jshell> int elevar(int n){ return n * n;} | created method elevar(int) jshell> elevar(4); $9 ==> 16
  • 78. Cambio de Definiciones Sesión 3: JShell jshell> int elevar(int n){ return n * n * n;} | modified method elevar(int) jshell> elevar(4) $11 ==> 64
  • 79. Comandos ● /vars ● /methods ● /open Sesión 3: JShell ● /help ● /exit ● /save ● /list ○ -all ○ -history ○ -start ○ -<tab>
  • 80. /save Sesión 3: JShell jshell> /save [-all|-history|-start] <file> jshell> /save -all HackatonOpenJDK.java
  • 81. /open Sesión 3: JShell jshell> /open <file> jshell> /open HackatonOpenJDK.java
  • 82. Manos a la obra: Es tiempo de practicar https://github.com/AdoptOpenJDK/jdk9-jigsaw/tree/master/session-3-jshell Sesión 2: JShell
  • 83. Manos a la obra: Como nos fué (feedback) 10 Minutos Sesión 2: JShell
  • 84. Sesión 4: Introducción a JLink 5 Minutos Alberto Salazar Ecuador @betoSalazar
  • 85. Sesión 4: Introducción a JLink Pre-Java 9 Sesión 3: JLink Applicacion: Paquetes & Clases JDK (javac) Paquete (Distribuible) Compila r Creamo s Crear y empaquetar nuestro artefacto, que corre donde quiera, pero necesita una plataforma específica JDK Depende o necesita Para correr JVM (the Platform) Java, el lenguaje (Packages & Clases)
  • 86. Sesión 4: Introducción a JLink Java 9 Sesión 3: JLink Creamo s Crear un aplicación standalone distribuible (smaller footprint), que corre en una plataforma específica JVM, the Platform Java, el lenguaje (JDK modules) JDK Nuestra Applicacion: Módulos Compila JDK: Módulos JLink Aplicacion (App modules)
  • 87. Manos a la obra: Es tiempo de practicar https://github.com/AdoptOpenJDK/jdk9-jigsaw/tree/master/session-2-jlink Sesión 3: JLink 30 Minutos
  • 88. Manos a la obra: Como nos fué (feedback) 10 Minutos Sesión 3: JLink