JDK 8 Preview
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

JDK 8 Preview

on

  • 944 views

JDK 8 Preview for the Costa RIca Java Users Group

JDK 8 Preview for the Costa RIca Java Users Group

Statistics

Views

Total Views
944
Views on SlideShare
905
Embed Views
39

Actions

Likes
1
Downloads
14
Comments
0

7 Embeds 39

http://oracledbacr.blogspot.com 27
http://blog.informatech.cr 5
http://oracledbacr.blogspot.com.es 3
http://oracledbacr.blogspot.com.ar 1
http://oracledbacr.blogspot.mx 1
http://oracledbacr.blogspot.in 1
http://oracledbacr.blogspot.com.br 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

JDK 8 Preview Presentation Transcript

  • 1. JDK 8 Developer PreviewBienvenidosPronto daremos inicio…Edwin Dalorzo | 2013edwin@dalorzo.com
  • 2. 1 Introducción a las Expresiones Lambda
  • 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. 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. 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. 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. 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. 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. Ruby (1995) [1,2,3,4,5,6,7,8,9].select {|x| x % 2 == 0} Introducción a las expresiones Lambda | 9
  • 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. C# (since 3.0 / 2007) Enumerable.Range(1, 9) .Where(n => n % 2 == 0); Introducción a las Expresiones Lambda | 11
  • 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. 2 Introducción a la Programación de Orden Superior
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Supplierinterface Supplier<T> { public T get();} Programación de Orden Superior | 26
  • 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. 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. 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. 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. 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. 3 Introducción a las Referencias de Métodos
  • 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. 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. 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. 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. 4 Introducción a la Nueva API de Streams
  • 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. 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. 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. 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. 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. 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. Paralelismo Nueva API de Streams | 44
  • 45. 5 Introducción a las Métodos de Extensión
  • 46. Métodos Predeterminadosinterface Warrior { public default String fight() { return "Warriors fight"; }} Métodos de Extension | 46
  • 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. 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. 6 Introducción al Paralelismo
  • 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. 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. 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. Analogía 1x6=6 hrs 0.5x6=3 hrs 0.25x6=1.5 hrs 6/6 = 1 hr Paralelismo | 53
  • 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. 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