Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
What to Upload to SlideShare
What to Upload to SlideShare
Loading in …3
×
1 of 59

Kit de supervivencia para Java 8 : como prepararse para Java 9

0

Share

Download to read offline

Mi presentación en el FooCamp RD 2017. Ejemplos disponibles en https://github.com/ecabrerar/java-8-mas-alla-de-las-expresiones-lambda

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Kit de supervivencia para Java 8 : como prepararse para Java 9

  1. 1. Kit de supervivencia para Java 8: Como prepararse para Java 9 #FooCampRD2017 Eudris Cabrera Junio 24, 2017
  2. 2. Eudris Cabrera Graduado de Ingeniería Telemática en la PUCMM. Entusiasta de la tecnología y el software libre, desarrollador Java, instructor ocasional (Java / Linux), aficionado del béisbol/sóftbol y los bailes latinos. En el tiempo libre, escribe artículos, realiza charlas, participa en eventos tecnológicos y ayuda en la revisión de documentación técnica en el mundo Java y el código abierto.
  3. 3. Java SE 8 Liberado en marzo del 2014, es la plataforma que incluye la actualización más grande para el modelo de programación Java desde el lanzamiento de la plataforma en 1996. Incluye nuevas funcionalidades e incorpora las características de los lenguaje funcionales.
  4. 4. Expresiones Lambda Stream API Métodos Predeterminados("Default") Métodos de Referencia Breve resumen sobre Java 8 Date Time APIs JSR 310
  5. 5. Tenemos una lista del tipo del tipo Team y sobre ella queremos realizar algunas operaciones cumpliendo ciertos criterios. public void printTeamsHasNotWonWorldSeries(List<Team> teams){ for (Team team : teams) { if(!team.isHasWonWoldSeries()){ System.out.println(""+ team.toString()); } } } Cuáles desventajas presenta esta solución ?
  6. 6. Ejemplo public void printTeamsWithPredicate(List<Team> teams, Predicate<Team> tester){ for (Team t : teams) { if(tester.test(t)){ System.out.println(""+ t.toString()); } } } Predicate<Team> hasNotWonWS = new Predicate<Team>() { @Override public boolean test(Team t) { return !t.isHasWonWoldSeries(); } }; printTeamsWithPredicate(teams, hasNotWonWS); ¿Cuál es el inconveniente de esta solución? Las clases anónimas reduce la cantidad de clases creadas y el paso de comportamiento como parámetro se mantiene, pero aún se puede detectar mucho código repetido. Solución usando clases anónimas
  7. 7. En nuestro ejemplo anterior, podemos utilizar una expresión lambda en lugar de una clase anónima. Ejemplo básico usando expresiones lambdas. printTeamsWithPredicate(teams, (Team t) -> !t.isHasWonWoldSeries()); Nota: Puede parecer bastante confuso en un principio, pero ya revisaremos los conceptos y cambios en el lenguaje que nos permitirán escribir código Java de esa manera.
  8. 8. Expresiones lambdas Una expresión lambda representa una función anónima. λx → x+x Función anónima que toma un número x y devuelve el resultado x + x.
  9. 9. Desarrolló en los años 30's el "Cálculo lambda", un sistema formal en lógica matemática diseñado para investigar la definición de función, la noción de aplicación de funciones y la recursión. Alonzo Church
  10. 10. Una expresión lambda se compone de un conjunto de parámetros, un operador lambda ( -> ) y un cuerpo de la función.
  11. 11. Sintaxis () -> System.out.println("Hello Lambda") x -> x + 10 (int x, int y) -> { return x + y; } (String x, String y) -> x.length() – y.length() (int a, int b) --> a + b (int a) --> a + 1 (int a, int b) --> { System.out.println(a + b); return a + b; } () --> new ArrayList();
  12. 12. Expresiones Lambda abre la puerta hacia la programación funcional en Java Funciones como entidades de primer nivel La programación funcional establece que las funciones (métodos) sean definidas como entidades de primer nivel. ¿Qué significa eso? Que las funciones pueden ser usada de la misma forma que usamos enteros (integers) o cadenas de caracteres(strings). Se pueden pasar funciones como parámetros a otras funciones y pueden ser retornada como resultado de otras funciones.
  13. 13. Interfaces Funcionales En Java, una interfaz funcional es, básicamente, una interfaz con un único método abstracto. Es la base para que podamos escribir expresiones lambda. La interface puede tener métodos por defecto y estáticos sin que esto afecte su condición de ser interface funcional. Este tipo de interfaces también son conocidos como tipos SAM (Single Abstract Method).
  14. 14. Interfaces Funcionales @FunctionalInterface public interface Runnable { public abstract void run(); } Debido a que una interfaz funcional contiene sólo un método abstracto, puede omitir el nombre de ese método cuando se implementa. Para ello, en lugar de utilizar una expresión de clase anónima, se utiliza una expresión lambda. Runnable r = () -> System.out.println("Hello Lambda");
  15. 15. Métodos Predeterminados("Default") Tradicionalmente, las interfaces no pueden tener definiciones de método (sólo declaraciones). A partir de esta versión, las interfaces pueden proveer métodos con una implementación por defecto. Las clases que implementen dichas interfaces heredarán automáticamente la implementación por defecto si éstas no proveen una explícitamente.
  16. 16. Métodos Predeterminados("Default") public interface A { default void foo() { System.out.println("Calling A.foo()"); } } public class Clazz implements A { } public interface SaludoMananaInterface { default void saludo(){ System.out.println("Buenos días"); } }
  17. 17. Nuevos métodos predeterminados en interfaces existentes que pueden utilizar Lambdas Iterable Iterable.forEach(Consumer c) Collection Collection.removeIf(Predicate p) List List.replaceAll(UnaryOperator o) List.sort(Comparator c) Reemplaza "Collections.sort(List l, Comparator c)"
  18. 18. Métodos de Referencias Formato: target_reference::method_name class Person { private String name; private int age; public int getAge() {return this.age;} public String getName() {return this.name;} } Person[] people = ...; Comparator<Person> byName = Comparator.comparing(Person::getName); Arrays.sort(people, byName); Cuando una expresión lambda se compone de una sola sentencia e invoca algún método existente por medio de su nombre, existe la posibilidad de escribirla usando métodos de referencia, con lo cual se logra un código más compacto y fácil de leer.
  19. 19. Métodos de Referencias (Tipos) ● Método estático (ClassName::methName) ● Un método de instancia de un objeto particular (instanceRef::methName) ● Un método super de un objeto particular (super::methName) ● Un método de instancia de un objeto arbitrario de un tipo particular (ClassName::methName) ● Un constructor de una clase (ClassName::new) ● Un constructor de un arreglo (TypeName[]::new)
  20. 20. Nuevo paquete java.util.function ● Predicate<T> - Recibe un argumento tipo T y retorna un booleano. ● Consumer<T> - una acción que se realiza sobre un objeto ● Function<T,R> - una función que transforma un valor T a R ● Supplier<T> - provee una instancia de T (como un factory). ● UnaryOperator<T> - Forma especializada de Function. Recibe un valor T como argumento y retorna de un valor del mismo tipo T. ● BinaryOperator<T> - Forma especializada de BiFunction. Recibe dos argumentos y retorna un resultado, todos del mismo tipo.
  21. 21. ● Expresiones Lambdas no solo nos ayuda a escribir código más conciso y significativo, sino que también permite simplificar la codificación paralela. ● Métodos por defecto/estáticos en interfaces: Evolución de librerías sin perder compatibilidad gracias a que ahora podemos definir e implementar métodos en las interfaces. ● Simplifica como pasar comportamiento como un parámetro (funciones como entidades de primer nivel). ● Interfaces funcionales: Concepto clave para poder escribir expresiones lambda. Interfaces con solo un método abstracto. Resumen sobre Expresiones Lambdas
  22. 22. Introducción al API Stream Stream: ● Representa una abstracción para especificar cálculos agregados (acumulativos). ● Simplifica la descripción de los cálculos agregados (laziness,paralelismo).
  23. 23. Elementos de un Stream Un Stream se compone de 3 elementos: ● Un origen ● Cero o más operaciones intermedias ● Una operación final (salida o un resultado)
  24. 24. Ejemplo long totalEquipos = teams.stream() .filter(t -> t.isHasWonWoldSeries()) .mapToInt(Team::getLastTimeWonWorldSeries) .count(); Source Intermediate operations Terminal operation
  25. 25. java.util.stream List<MLBTeam> teams = ..; // sequential version Stream stream = students.stream(); //parallel version Stream parallelStream = students.parallelStream();
  26. 26. java.util.stream Stream Sources (Origen) ● Collections ● Generadores (Generators) ● Otros Streams
  27. 27. Ejemplo Procesar la siguiente lista para que solamente contenga cadena de caracteres impares y en letra minúscula. List<String> list = Arrays.asList("BarCamp", "MongoDB", "10Gen", "TokuMX", "Nagios", "PUCMM", "Ruby", "JSON", "JSON"); Solución usando clase anónima List<String> newList = list .stream() .filter(new Predicate<String>() { @Override public boolean test(String t) { return (t.length() % 2)==1; } }).map(String::toLowerCase) .collect(Collectors.toList()); Solución usando expresiones lambdas List<String> newList = list .stream() .filter(s -> (s.length() % 2)==1) .map(String::toLowerCase) .collect(Collectors.toList());
  28. 28. Ejemplo Usando Generadores (Generators) OptionalInt one = IntStream.generate(() -> 1) .limit(10) .distinct() .findFirst(); Otros Streams Stream<String> streamCaracter = Stream.of("one", "two"); IntStream streamDeEntero = IntStream.of(5, 10);
  29. 29. java.util.stream Operaciones Intermedias ● .filter ● .map ● .flatMap ● .peek ● .distinct ● .sorted ● .limit ● .substream
  30. 30. Ejemplo a) filter(Predicate predicate) OptionalInt oldestYear = teams.stream() .filter(t -> t.isHasWonWoldSeries()) .mapToInt(Team::getLastTimeWonWorldSeries) .min(); c) OptionalInt one = IntStream .generate(() -> 1) .limit(10) .distinct() .findFirst(); limit(long maxSize) distinct() b) map(Function<? super T, ? extends R> mapper) List<String> list = Arrays.asList("BarCamp", "MongoDB", "10Gen", "TokuMX", "Nagios", "PUCMM", "Ruby", "JSON", "JSON"); List<String> newList = list .stream() .filter(s -> (s.length() % 2)==1) .map(String::toLowerCase) .collect(Collectors.toList());
  31. 31. java.util.stream Operaciones Finales (Terminal Operations) ● reducers like reduce(), count(), findAny(), findFirst() ● collectors (collect()) ● forEach ● iterators
  32. 32. Ejemplo Creación de un Stream vacío Stream<String> emptyStream = Stream.empty(); long val = emptyStream.count(); Suma de arreglo de enteros int[] numbers = {1, 2, 3, 4, 5, 6, 7}; int sum = Arrays.stream(numbers).sum(); Usando operación count long count = Stream.of("one").count(); Convertir Stream a List List<String> abc = Stream.of("a", "b", "c") .collect(Collectors.toList()); Usando forEach(Consumer c) List<Team> teams = new ArrayList<>(); teams.add(new Team("STL", "St. Louis Cardinals", true, 2011)); teams.add(new Team("NYM", "NY Mets", true, 1986)); teams.add(new Team("LAA", "LA Angels", true, 2002)); teams.add(new Team("WSN", "Washington Nationals", false, 0)); teams.add(new Team("LAD", "LA Dodgers", false, 0)); teams.forEach(p -> System.out.println(p));
  33. 33. Streams de objetos y tipos primitivos ● Java tiene valores primitivos, así como tipos de objetos. ● Para mejorar la eficiencia de Stream tenemos tres Stream de tipos primitivos ○ IntStream, DoubleStream, LongStream ● Pueden usarse junto a los métodos mapToInt(), mapToDouble(), mapToLong()
  34. 34. Ejemplo Trabajando con mapToInt(ToIntFunction<T>) int highScore = students.stream() .filter(s -> s.graduationYear() == 2015) .mapToInt(s -> s.getScore()) .max(); OptionalInt oldestYear = teams.stream() .filter(t -> t.isHasWonWoldSeries()) .mapToInt(Team::getLastTimeWonWorldSeries) .min(); Method References
  35. 35. Date Time API JSR 310 Nuevo API de fecha/tiempo en java
  36. 36. Date Time API El Date and Time API se desarrolló como parte del Java Community Process (JCP) dirigido por Stephen Colebourne (autor de Joda-Time) y Oracle, bajo JSR 310. El paquete java.time es el núcleo de la API y utiliza el sistema de calendario definido en ISO-8601 (https://www.iso.org/iso-8601-date-and-time-format.html ) como el calendario predeterminado. El calendario ISO se basa en el sistema de calendario gregoriano y es el estándar internacional para representar fecha y hora. Para soportar las necesidades de los desarrolladores que utilizan sistemas de calendario no ISO, en algunas áreas del mundo, como Japón o Tailandia, el nuevo API de Tiempo y Fecha permite trabajar con diferentes sistemas de calendario.
  37. 37. java.time LocalDate : Fecha más fácil de interpretar. LocalDate date = LocalDate.now(); System.out.printf("%s-%s-%s", date.getYear(), date.getMonthValue(), date.getDayOfMonth()); LocalDateTime: Maneja fecha y hora sin especificar la zona horaria LocalDateTime localDateTime = LocalDateTime.now(); ZonedDateTime zdateTime = ZonedDateTime.now(); //fecha y hora con zona horaria Zona Horaria ZoneId zone = ZoneId.systemDefault(); Clock clockDefault = Clock.systemDefaultZone(); ZoneId zoneAmerica = ZoneId.of("America/Santo_Domingo"); Clock clock = Clock.system(zoneAmerica);
  38. 38. java.time Haciendo cálculo de fechas LocalDate sinceJava8Launch = LocalDate.of(2014, Month.MARCH, 18); LocalDate today = LocalDate.now(); today.isAfter(sinceJava8Launch); //true Calcular diferencia entre dos fecha usando period LocalDate sinceBarCamp2013 = LocalDate.of(2013, Month.NOVEMBER, 16); LocalDate currentDate = LocalDate.of(2015, Month.NOVEMBER, 28); Period betweenDates = Period.between(sinceBarCamp2013, currentDate); int diffInDays = betweenDates.getDays(); int diffInMonths = betweenDates.getMonths(); int diffInYears = betweenDates.getYears();
  39. 39. TemporalQuery Determinar si una fecha es festiva usando TemporalQuery LocalDate date = LocalDate.of(2016, Month.JANUARY, 26); Boolean isHoliday = date.query(new DiasFestivosRD()); public class DiasFestivosRD implements TemporalQuery<Boolean>{ static List<MonthDay> DIAS_FESTIVOS = Lists.newArrayList( MonthDay.of(Month.JANUARY, 1), // Año Nuevo MonthDay.of(Month.JANUARY, 6), // Día Santos Reyes MonthDay.of(Month.JANUARY, 21), // Día de la Altagracia MonthDay.of(Month.JANUARY, 26), // Día del Natalicio de Duarte MonthDay.of(Month.FEBRUARY, 27), // Día Independencia Nacional MonthDay.of(Month.MAY, 1), //Día Trabajador MonthDay.of(Month.AUGUST, 16), //Día Restauración MonthDay.of(Month.SEPTEMBER, 24), //Día de las Mercedes MonthDay.of(Month.NOVEMBER, 6), //Día Constitución MonthDay.of(Month.DECEMBER, 25) //Día de Navidad ); @Override public Boolean queryFrom(TemporalAccessor date) { MonthDay diaMesActual = MonthDay.from(date); return DIAS_FESTIVOS.contains(diaMesActual); } }
  40. 40. TemporalQuery Determinar si una fecha es esta dentro de la temporada ciclónica LocalDate date = LocalDate.of(2017, Month.JUNE, 30); Boolean esTemporadaCiclonica = date.query(new TemporadaCiclonica()); public class TemporadaCiclonica implements TemporalQuery<Boolean>{ @Override public Boolean queryFrom(TemporalAccessor temporal) { LocalDate fecha = LocalDate.from(temporal); MonthDay primeroJulio = MonthDay.of(Month.JUNE.getValue(), 1); MonthDay trentaNoviembre = MonthDay.of(Month.NOVEMBER.getValue(), 30); return fecha.isAfter(primeroJulio.atYear(fecha.getYear())) && fecha.isBefore(trentaNoviembre.atYear(fecha.getYear())); } }
  41. 41. Sistema Modular - Proyecto Jigsaw Es la principal novedad en Java 9. La idea de un sistema modular es hacer el jdk más ligero para dispositivos pequeños. El sistema de módulos proporcionará a la aplicación la capacidad de utilizar sólo los módulos del jdk que sean necesarios. Las aplicaciones ya no necesitarán el jdk completo. El sistema de módulos encapsula las clases públicas dentro de un módulo. Así que clase definida pública no estaría disponible para el mundo entero hasta que un módulo lo defina explícitamente.
  42. 42. Sistema Modular - Proyecto Jigsaw Los módulos van a ser descritos en un archivo llamado module-info.java ubicado en la parte superior de la jerarquía de código java. El archivo module-info provee: 1. Nombre del módulo. 2. Lista de dependencias de módulos necesarias para la correcta compilación y ejecución. 3. Información sobre paquetes exportados por este módulo. 4. Lista de servicios que proporciona el módulo en tiempo de ejecución.
  43. 43. Sistema Modular - Proyecto Jigsaw
  44. 44. Sistema Modular - Proyecto Jigsaw com.example.samplemodule : es el nombre del módulo. requires : Indica que son dependencia del módulo exports : Todas las clases públicas en estos paquetes serán accesibles a otros módulos que dependen de él. uses : Para usar datos de otros módulos. provides : Proporciona configuración al servicio de otro módulo
  45. 45. Sistema Modular - Proyecto Jigsaw $ javac -d mods/com.eudriscabrera.examples.greetings com.eudriscabrera.examples.greetings/com/eudriscabrera/examples/greetings/Main.java com.eudriscabrera.examples.greetings/module-info.java
  46. 46. Sistema Modular - Proyecto Jigsaw Crear un jar a partir de módulo $ jar -c -f com.eudriscabrera.examples.greetings.jar -C com.eudriscabrera.examples.greetings .
  47. 47. JShell - Java 9 REPL Un REPL (Read-Eval-Print Loop) es una herramienta de línea de comandos para la ejecución de sentencias de forma rápida.
  48. 48. Métodos Privados en Interfaces Además de los métodos default "predeterminados", ahora en Java 9 puede declarar métodos privados. La idea es poder ocultar aquellas implementaciones de métodos que no tienen que ser expuesta a las clases que implementen la interfaz.
  49. 49. Métodos Privados en Interfaces
  50. 50. ¿Preguntas?
  51. 51. ¡Gracias por Acompañarnos!
  52. 52. Referencias Recursos para Java 8 Libros: Functional Programming in Java (Dr. Venkat Subramaniam) Enlaces: http://slidedeck.io/DDuarte/java8-slides http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html https://dzone.com/articles/java-lambda-expressions-basics http://www.oracle.com/technetwork/es/articles/java/expresiones-lambda-api-stream-java-2633852-esa.html http://www.oracle.com/technetwork/es/articles/java/expresiones-lambda-api-stream-java-2737544-esa.html http://www.infoq.com/presentations/java-8-lambda-streams http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
  53. 53. Referencias Recursos para Java 9 Enlaces: https://www.sitepoint.com/ultimate-guide-to-java-9/ https://blogs.oracle.com/darcy/more-concise-try-with-resources-statements-in-jdk-9 https://blogs.oracle.com/java/features-in-java-8-and-9 https://www.pluralsight.com/blog/software-development/java-9-new-features https://aboullaite.me/wrapping-up-java-9-new-features/?imm_mid=0f16b7&cmp=em-prog-na-na-newsltr_20170506
  54. 54. https://github.com/ecabrerar/java-8-mas-alla-de-las-expresiones-lambda Código fuente de los ejemplos en GitHub
  55. 55. Asuntos Legales Todas las marcas registradas, así como todos los logotipos, imágenes, fotografías, audio y vídeos mostrados en esta presentación son propiedad de sus respectivos propietarios y/o representantes. Su utilización es solamente para fines ilustrativos.
  56. 56. @eudriscabrera @eudris @ecabrerar @eudriscabrera Eudris Cabrera Rodríguez Ingeniero Telemático Desarrollador de Software / Consultor Informático eudris@gmail.com https://www.linkedin.com/in/eudriscabrera http://www.slideshare.net/eudris https://twitter.com/eudriscabrera https://github.com/ecabrerar

×