Your SlideShare is downloading. ×
0
JDK 8 Developer PreviewBienvenidosPronto daremos inicio…Edwin Dalorzo | 2013edwin@dalorzo.com
1   Introducción a las    Expresiones Lambda
Lambda Calculus        Alonzo Church (Junio 14, 1903 – Agosto 11, 1995)        Matemático y lógico norteamericano quien hi...
Lisp (1958)  (filter (lambda (n)              (= (remainder n 2) 0))            (list 1 2 3 4 5 6 7 8 9))                 ...
SML (1973)     open List     filter        (fn n => n mod 2 = 0)        [1,2,3,4,5,6,7,8,9]                               ...
Haskell (1990)     filter        (n -> n `mod` 2 == 0)        [1,2,3,4,5,6,7,8,9]                             Introducción...
Python (1991)     filter (       (lambda n: n % 2 == 0),       [1,2,3,4,5,6,7,8,9])                             Introducci...
JavaScript (1994) [1,2,3,4,5,6,7,8,9].filter(               function(n) {                    return n % 2 === 0;          ...
Ruby (1995)     [1,2,3,4,5,6,7,8,9].select          {|x| x % 2 == 0}                              Introducción a las expre...
Scala (2003)    List(1,2,3,4,5,5,6,7,8,9)        filter(n => n % 2 == 0)                             Introducción a las ex...
C# (since 3.0 / 2007)        Enumerable.Range(1, 9)           .Where(n => n % 2 == 0);                                Intr...
Java (since 8.0 / 2013 – y 55 años después) asList(1,2,3,4,5,6,7,8,9)       .stream()       .filter(n -> n % 2 == 0);     ...
2   Introducción a la    Programación de Orden    Superior
Filterfun even(n) = n mod 2 = 0fun odd(n) = n mod 2 <> 0filter(even, [1,2,3,4,5])                   //[2,4]filter(odd, [1,...
Predicateinterface Predicate<T> {   public boolean test(T t);}static <T> List<T> filter(Predicate<T> pred, List<T> source)...
Filterfilter(new Predicate<Integer>() {            @Override            public boolean test(Integer n) {                re...
Mapfun square(n) = n *   nfun fact(n) = if n    = 0               then   1               else   n * fact(n-1)map(square, [...
Functioninterface Function<T,R> {   public R apply(T t);}static <T,R> List<R> map(Function<T,R> func, List<T> source) {   ...
Mapmap(new Function<Integer, Integer>() {            @Override            public Integer apply(Integer n) {               ...
Reducefun sum(x, y) = x + yfun prod(x, y) = x * yreduce(sum, 0, [1,2,3,4,5])     //15reduce(prod, 1, [1,2,3,4,5]);   //120...
Binary Operatorinterface BinaryOperator<T> {   public T apply(T left, T right);}static <T> T reduce(BinaryOperator<T> oper...
Reducereduce(new BinaryOperator<Integer>() {            @Override            public Integer apply(Integer left, Integer ri...
Consumerinterface Consumer<T> {    public void accept(T t);}static <T> void forEach(Consumer<T> consumer, List<T> source) ...
forEachList<Integer> numbers = asList(1,2,3,4,5,6,7,8,9);forEach( new Consumer<Integer>() {            @Override          ...
Evaluación Estrictapublic static int calculateX() {   //algunos cálculos…   return 0;}public static int calculateY() {   /...
Supplierinterface Supplier<T> {    public T get();}                          Programación de Orden Superior | 26
Evaluación Perezosapublic static int calculate(Supplier<Integer> thunkOfX,                            Supplier<Integer> th...
Evaluación Perezosapublic static int calculate(Supplier<Integer> thunkOfX,                            Supplier<Integer> th...
Interfaces Funcionales                        Predicate<T>Function<T,R>Consumer<T>                       Comparator<T>    ...
Sintaxis LambdaInterfaz            Firma del Método           Sintaxis de la Expresión LambdaFuncionalPredicate<T>        ...
StreamsList<Integer> numbers = asList(-1,-2,-3,-4,-5,-6,-7,-8,-9);int sum = numbers.stream()                 .map(n -> Mat...
3   Introducción a las    Referencias de Métodos
Referencia Estática                    interface Predicate<Integer> {                                          public bool...
Referencia de ConstructorList<String> digits = asList("1","2","3","4","5");List<Double> myDoubles = map(Double::new, digit...
Referencia de Instancia ArbitrariaList<Jedi> jedis = asList(new Jedi("Obi-wan", 80),                          new Jedi("An...
Referencia de InstanciaEspecíficaList<String> names = asList("Obi-wan","Ankin","Yoda");forEach(System.out::println, names)...
4   Introducción a la    Nueva API de Streams
Ejemplo 1List<Jedi> jedis = asList(new Jedi("Obi-wan", 80),                          new Jedi("Anakin", 25),              ...
Ejemplo 2List<Jedi> jedis = asList(new Jedi("Obi-wan", 80),                          new Jedi("Anakin", 25),              ...
Evaluación Perezosaint[] nats = new int[19_999_999];for(int i=0; i < nats.length; i++) {    nats[i] = i;}IntStream primes ...
Corto Circuito #1int[] nats = new int[19_999_999];for(int i=0; i < nats.length; i++) {    nats[i] = i;}IntStream primes = ...
Corto Circuito #2int[] nats = new int[19_999_999];for(int i=0; i < nats.length; i++) {    nats[i] = i;}IntStream primes = ...
ParalelismoIntStream primes = Arrays.stream(nats)                         .parallel() //!                         .filter(...
Paralelismo              Nueva API de Streams | 44
5   Introducción a las    Métodos de Extensión
Métodos Predeterminadosinterface Warrior {     public default String fight() {        return "Warriors fight";    }}      ...
Escogiendo El Más Específicointerface Warrior {     public default String fight() {        return "Warriors fight";    }}i...
Lidiando con el Conflictointerface Ninja extends Warrior {    public default String fight() {       return Warrior.super.f...
6   Introducción al    Paralelismo
Ley de MooreLa ley de Moore es laobservación de que através de la historiade la computación elnúmero detransistores en los...
Ciclos de Reloj                                                                             Herb Sutter (Dr.Dobb’s, Marzo ...
La Revolución del Paralelismo       Mauriece Herlihy & Nir Shavit (2008)       La industria de la computación está sufrien...
Analogía                1x6=6 hrs                0.5x6=3 hrs                0.25x6=1.5 hrs   6/6 = 1 hr                   ...
¿Qué Queremos?   Programación de Orden          Superior   Expresiones Lambda &          Closures        Inmutabilidad    ...
GraciasOracle Day 2013http://jdk8.java.net/lambda/https://github.com/edalorzo/jdk8-previewhttp://blog.informatech.cr/autho...
Upcoming SlideShare
Loading in...5
×

JDK 8 Preview

818

Published on

JDK 8 Preview for the Costa RIca Java Users Group

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
818
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "JDK 8 Preview"

  1. 1. JDK 8 Developer PreviewBienvenidosPronto daremos inicio…Edwin Dalorzo | 2013edwin@dalorzo.com
  2. 2. 1 Introducción a las Expresiones Lambda
  3. 3. Lambda Calculus Alonzo Church (Junio 14, 1903 – Agosto 11, 1995) Matemático y lógico norteamericano quien hizo grandes contribuciones a lógica matemática y a las fundaciones de la teoría computacional. Es más conocido por su tesis del cálculo lambda (~1930-1950). λf. λs.(f (s s)) λf. λx.x λe1. λe2.λec.((c e1) e2) Introducción a las Expresiones Lambda | 3
  4. 4. Lisp (1958) (filter (lambda (n) (= (remainder n 2) 0)) (list 1 2 3 4 5 6 7 8 9)) Introducción a las Expresiones Lambda | 4
  5. 5. SML (1973) open List filter (fn n => n mod 2 = 0) [1,2,3,4,5,6,7,8,9] Introducción a las Expresiones Lambda | 5
  6. 6. Haskell (1990) filter (n -> n `mod` 2 == 0) [1,2,3,4,5,6,7,8,9] Introducción a las Expresiones Lambda | 6
  7. 7. Python (1991) filter ( (lambda n: n % 2 == 0), [1,2,3,4,5,6,7,8,9]) Introducción a las Expresiones Lambda | 7
  8. 8. JavaScript (1994) [1,2,3,4,5,6,7,8,9].filter( function(n) { return n % 2 === 0; }); Introducción a las Expresiones Lambda | 8
  9. 9. Ruby (1995) [1,2,3,4,5,6,7,8,9].select {|x| x % 2 == 0} Introducción a las expresiones Lambda | 9
  10. 10. Scala (2003) List(1,2,3,4,5,5,6,7,8,9) filter(n => n % 2 == 0) Introducción a las expresiones Lambda | 10
  11. 11. C# (since 3.0 / 2007) Enumerable.Range(1, 9) .Where(n => n % 2 == 0); Introducción a las Expresiones Lambda | 11
  12. 12. Java (since 8.0 / 2013 – y 55 años después) asList(1,2,3,4,5,6,7,8,9) .stream() .filter(n -> n % 2 == 0); Introducción a las Expresiones Lambda | 12
  13. 13. 2 Introducción a la Programación de Orden Superior
  14. 14. Filterfun even(n) = n mod 2 = 0fun odd(n) = n mod 2 <> 0filter(even, [1,2,3,4,5]) //[2,4]filter(odd, [1,2,3,4,5]); //[1,3,5]filter(fn n => n mod 5 = 0, [1,2,3,4,5]) //[5] Programación de Orden Superior| 14
  15. 15. Predicateinterface Predicate<T> { public boolean test(T t);}static <T> List<T> filter(Predicate<T> pred, List<T> source) { List<T> destiny = new ArrayList<>(); for(T item : source) { if(pred.test(item)) { //! destiny.add(item); } } return destiny;} Programación de Orden Superior| 15
  16. 16. Filterfilter(new Predicate<Integer>() { @Override public boolean test(Integer n) { return n % 2 != 0; } }, asList(1,2,3,4,5)); //1,3,5filter( n -> n % 2!=0, asList(1,2,3,4,5)); //1,3,5 Programación de Orden Superior| 16
  17. 17. Mapfun square(n) = n * nfun fact(n) = if n = 0 then 1 else n * fact(n-1)map(square, [1,2,3,4,5]) //[1,4,9,16,25]map(fact, [1,2,3,4,5]); //[1,2,6,24,120] Programación de Orden Superior | 17
  18. 18. Functioninterface Function<T,R> { public R apply(T t);}static <T,R> List<R> map(Function<T,R> func, List<T> source) { List<R> destiny = new ArrayList<>(); for(T item : source) { R value = func.apply(item); //! destiny.add(value); } return destiny;} Programación de Orden Superior | 18
  19. 19. Mapmap(new Function<Integer, Integer>() { @Override public Integer apply(Integer n) { return n * n; } }, asList(1,2,3,4,5)); //1,4,9,16,25map(n -> n * n, asList(1,2,3,4,5)); //1,4,9,16,25 Programación de Orden Superior | 19
  20. 20. Reducefun sum(x, y) = x + yfun prod(x, y) = x * yreduce(sum, 0, [1,2,3,4,5]) //15reduce(prod, 1, [1,2,3,4,5]); //120reduce(fn (a,b) => a ^ b, “”, [“h”, “o”, “l”, “a”]) //“hola” Funciones de Orden Superior | 20
  21. 21. Binary Operatorinterface BinaryOperator<T> { public T apply(T left, T right);}static <T> T reduce(BinaryOperator<T> oper, T seed, List<T> source) { for(T item : source) { seed = oper.apply(seed, item); //! } return seed;} Funciones de Orden Superior | 21
  22. 22. Reducereduce(new BinaryOperator<Integer>() { @Override public Integer apply(Integer left, Integer right) { return left + right; } } ,0, asList(1,2,3,4,5)); //15reduce((left,right) -> left + right, 0, asList(1,2,3,4,5)); //15 Funciones de Orden Superior | 22
  23. 23. Consumerinterface Consumer<T> { public void accept(T t);}static <T> void forEach(Consumer<T> consumer, List<T> source) { for(T item : source) { consumer.accept(item); //! }} Programación de Orden Superior | 23
  24. 24. forEachList<Integer> numbers = asList(1,2,3,4,5,6,7,8,9);forEach( new Consumer<Integer>() { @Override public void accept(Integer n) { System.out.println(n); } }, numbers);forEach( n -> { System.out.println(n); }, numbers); Programación de Orden Superior | 24
  25. 25. Evaluación Estrictapublic static int calculateX() { //algunos cálculos… return 0;}public static int calculateY() { //cálculo pesado… return 1;}public static int calculate(int x, int y) { if(x <= 0) return 0; else return x + y;}//…calculate( calculateX(), calculateY() ); //! Funciones de Orden Superior | 25
  26. 26. Supplierinterface Supplier<T> { public T get();} Programación de Orden Superior | 26
  27. 27. Evaluación Perezosapublic static int calculate(Supplier<Integer> thunkOfX, Supplier<Integer> thunkOfY) { int x = thunkOfX.get(); if(x <= 0) return 0; else return x + thunkOfY.get();}calculate( new Supplier<Integer>() { @Override public Integer get() { return generateX(); } }, new Supplier<Integer>() { @Override public Integer get() { return generateY(); } }); Funciones de Orden Superior | 27
  28. 28. Evaluación Perezosapublic static int calculate(Supplier<Integer> thunkOfX, Supplier<Integer> thunkOfY) { int x = thunkOfX.get(); if(x <= 0) return 0; else return x + thunkOfY.get();}calculate( () -> generateX() , () -> generateY() ); Programación de Orden Superior | 28
  29. 29. Interfaces Funcionales Predicate<T>Function<T,R>Consumer<T> Comparator<T> BinaryOperator<T>Supplier<T> Runnable > ActionListener<T Callable<T> Programación de Orden Superior | 29
  30. 30. Sintaxis LambdaInterfaz Firma del Método Sintaxis de la Expresión LambdaFuncionalPredicate<T> public boolean test(T t) n -> n % 2 != 0BinaryOperator<T> public T apply(T l, T r) (x,y) -> x + ySupplier<T> public T void get() () -> “Hola Mundo!”Consumer<T> public void accept(T t) s -> { System.out.println(s); }Runnable public void run() () -> { System.out.println(“Hola”); } Programación de Orden Superior | 30
  31. 31. StreamsList<Integer> numbers = asList(-1,-2,-3,-4,-5,-6,-7,-8,-9);int sum = numbers.stream() .map(n -> Math.abs(n)) .filter(n -> n <= 5) .reduce(0, (x, y) -> x + y); //15 Programación de Orden Superior | 31
  32. 32. 3 Introducción a las Referencias de Métodos
  33. 33. Referencia Estática interface Predicate<Integer> { public boolean test(Integer n); }static class IntPredicates { public static boolean isOdd(Integer n) { return n % 2 != 0; } public static boolean isEven(Integer n) { return n % 2 == 0; } public static boolean isPositive(Integer n) { return n >= 0; } public static boolean isPrime(Integer n) { … }}List<Integer> numbers = asList(1,2,3,4,5,6,7,8,9);List<Integer> odds = filter(IntPredicates::isOdd, numbers);List<Integer> evens = filter(IntPredicates::isEven, numbers); Referencias de Métodos | 33
  34. 34. Referencia de ConstructorList<String> digits = asList("1","2","3","4","5");List<Double> myDoubles = map(Double::new, digits);class Jedi { private String name; interface Function<String,Double> { private int power; public Dobule apply(String name); } public Jedi(String name) { this(name, 10); } interface Function<String,Jedi> { public Jedi apply(String name); public Jedi(String name, int power){ } this.name = name; this.power = power; } //getters & setters}List<String> names = asList("Jacen Solo","Jaina Solo","Anja Gallandro");List<Jedi> jedis = map(Jedi::new, names); Referencias de Métodos | 34
  35. 35. Referencia de Instancia ArbitrariaList<Jedi> jedis = asList(new Jedi("Obi-wan", 80), new Jedi("Anakin", 25), new Jedi("Yoda", 500));List<String> jedis = map(Jedi::getName, jedis);class Jedi { private String name; private int power; public Jedi(String name, int power){ interface Function<Jedi,String> { this.name = name; public String apply(Jedi jedi); this.power = power; } } public String getName() { return this.name } //getters & setters} Referencias de Métodos | 35
  36. 36. Referencia de InstanciaEspecíficaList<String> names = asList("Obi-wan","Ankin","Yoda");forEach(System.out::println, names); interface Consumer<String> { public void accept(String s);Offset byTen = new Offset(10); }Offset byFive = new Offset(5);forEach(byTen::printWithOffset, asList(1,2,3)); //11 12 13forEach(byFive::printWithOffset, asList(1,2,3)); //6 7 8public static class Offset { private int offset; public Offset(int offset){ interface Consumer<Integer> { this.offset = offset; public void accept(Integer n); } } public void printWithOffset(int number) { System.out.print(" " + (number + offset)); }} Referencias de Métodos | 36
  37. 37. 4 Introducción a la Nueva API de Streams
  38. 38. Ejemplo 1List<Jedi> jedis = asList(new Jedi("Obi-wan", 80), new Jedi("Anakin", 25), new Jedi("Yoda", 500));jedis.stream() .filter(j -> j.getPower() >= 50) .map(Jedi::getName) .forEach(System.out::println); Nueva API de Streams | 38
  39. 39. Ejemplo 2List<Jedi> jedis = asList(new Jedi("Obi-wan", 80), new Jedi("Anakin", 25), new Jedi("Yoda", 500));int sumOfAges = jedis.stream() .map(Jedi::getAge) // .filter(age -> age >= 50) .reduce(0, (x, y) -> x + y); //580List<Integer> numbers = asList(-1,-2,-3,-4,-5,-6,-7,-8,-9);int sum = numbers.stream() .map(Math::abs) .filter(n -> n <= 5) .reduce(0, (x, y) -> x + y); //15 Nueva API de Streams | 39
  40. 40. Evaluación Perezosaint[] nats = new int[19_999_999];for(int i=0; i < nats.length; i++) { nats[i] = i;}IntStream primes = Arrays.stream(nats) .filter(Predicates::isPrime); Nueva API de Streams | 40
  41. 41. Corto Circuito #1int[] nats = new int[19_999_999];for(int i=0; i < nats.length; i++) { nats[i] = i;}IntStream primes = Arrays.stream(nats) .filter(Predicates::isPrime);OptionalInt firstPrime = primes.findFirst(); //!1if(firstPrime.isPresent()){ System.out.println(firstPrime.getAsInt()); //!2} Nueva API de Streams | 41
  42. 42. Corto Circuito #2int[] nats = new int[19_999_999];for(int i=0; i < nats.length; i++) { nats[i] = i;}IntStream primes = Arrays.stream(nats) .filter(Predicates::isPrime);primes.limit(10) //! .forEach(System.out::println); //2,3,5,7,11…29 Nueva API de Streams | 42
  43. 43. ParalelismoIntStream primes = Arrays.stream(nats) .parallel() //! .filter(Predicates::isPrime);OptionalInt maxPrime = primes.max();if(maxPrime.isPresent()) { System.out.println(maxPrime.getAsInt()); //19999981} Nueva API de Streams | 43
  44. 44. Paralelismo Nueva API de Streams | 44
  45. 45. 5 Introducción a las Métodos de Extensión
  46. 46. Métodos Predeterminadosinterface Warrior { public default String fight() { return "Warriors fight"; }} Métodos de Extension | 46
  47. 47. Escogiendo El Más Específicointerface Warrior { public default String fight() { return "Warriors fight"; }}interface Ninja extends Warrior { public default String fight() { return Warrior.super.fight() + " and ninjas fight too"; }} Métodos de Extension | 47
  48. 48. Lidiando con el Conflictointerface Ninja extends Warrior { public default String fight() { return Warrior.super.fight() + " and ninjas fight too"; }}interface Samurai extends Warrior { public default String fight() { return "Samurais are the best warriors"; }} Métodos de Extension | 48
  49. 49. 6 Introducción al Paralelismo
  50. 50. Ley de MooreLa ley de Moore es laobservación de que através de la historiade la computación elnúmero detransistores en loscircuitos integradosse duplicaaproximadamentecada 2 años. Paralelismo | 50
  51. 51. Ciclos de Reloj Herb Sutter (Dr.Dobb’s, Marzo 2005) Comenzando hoy, el almuerzo gratis del desempeño se terminó […] Si queremos que nuestras aplicaciones se beneficien de progresos en rendimiento exponencial en los nuevos procesadores, tendrá que ser mediante aplicaciones concurrentes bien escritas. Y eso se dice más fácil de lo que realmente es, porque no todos los problemas son inherentemente paralelizables y porque la programación concurrente es difícil. Fuente: Herb Sutter (http://www.gotw.ca/publications/concurrency-ddj.htm) Paralelismo | 51
  52. 52. La Revolución del Paralelismo Mauriece Herlihy & Nir Shavit (2008) La industria de la computación está sufriendo otra revolución o al menos un vigoroso estremecimiento […] Los fabricantes principales de chips han dejado de intentar que los procesadores sean más veloces […] en su lugar están recurriendo a las arquitecturas multinúcleo […] haciendo la computación más efectiva por medio de explotar el paralelis […] esto tendrá un efecto profundo en la manera en como desarrollamos el software […] Los avances en tecnología implicarán mayor paralelismo y no mayores velocidades de de los ciclos de reloj. Paralelismo| 52
  53. 53. Analogía 1x6=6 hrs 0.5x6=3 hrs 0.25x6=1.5 hrs 6/6 = 1 hr Paralelismo | 53
  54. 54. ¿Qué Queremos? Programación de Orden Superior Expresiones Lambda & Closures Inmutabilidad Evaluación Tardía Evaluación de Corto-Circuito Paralelismo Paralelismo | 54
  55. 55. GraciasOracle Day 2013http://jdk8.java.net/lambda/https://github.com/edalorzo/jdk8-previewhttp://blog.informatech.cr/author/edalorzohttp://www.slideshare.net/edalorzoGrupo de Usuarios de Java Costa Ricaedwin@dalorzo.comhttp://www.linkedin.com/in/edalorzo
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×