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)
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.
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
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
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
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
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 💩
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
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