Successfully reported this slideshow.
Your SlideShare is downloading. ×

Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
Anti patterns
Anti patterns
Loading in …3
×

Check these out next

1 of 54 Ad
Advertisement

More Related Content

Slideshows for you (20)

Similar to Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces (20)

Advertisement

Recently uploaded (20)

Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces

  1. 1. Neue Sprachfeatures
  2. 2. λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
  3. 3. t Feb. 2002 Java 1.4 • • • • • • Assert ------------Regex NIO Logging JAXP JAAS/JSSE Sep. 2004 Java 1.5 • • • • • ? Generics -------------------------Varargs Compiler API Foreach Loop Scripting (JSR223) JAXB Improvements Static Imports JAX-WS Autoboxing JVM (Performance,...) -------------------Java.util.concurrent • • • • • • • • • • • Mär. 2014 Java 1.8 Jul. 2011 Java 1.7 Dez. 2006 Java 1.6 • • Switch (Strings) ARM (try-w-R) Diamond operator Multi-Exceptions Num-Literals -----------------------NIO2 invokeDynamic • • • • • Lambdas Method Refs. Default Meth. Functional Ifc Stream
  4. 4. C# 3.0 C# 2.0 Generics t Extension Methods, Lambdas Nov. 2007 Feb. 2002 Java 1.4 • • • • • • Assert ------------Regex NIO Logging JAXP JAAS/JSSE Sep. 2004 Java 1.5 • • • • • ? Generics -------------------------Varargs Compiler API Foreach Loop Scripting (JSR223) JAXB Improvements Static Imports JAX-WS Autoboxing JVM (Performance,...) -------------------Java.util.concurrent • • • • • • • • • • • Mär. 2014 Java 1.8 Jul. 2011 Java 1.7 Dez. 2006 Java 1.6 • • Switch (Strings) ARM (try-w-R) Diamond operator Multi-Exceptions Num-Literals -----------------------NIO2 invokeDynamic • • • • • Lambdas Method Refs. Default Meth. Functional Ifc Stream
  5. 5. λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
  6. 6. (int a, int b) → { return a * b; } (int a, int b) → a* b (a, b) → a* b x→ x*x
  7. 7. interface Callback { public int doit(int x); };
  8. 8. java.lang.Runnable void run() java.util.concurrent.Callable<V> V call() java.awt.event.ActionListener void actionPerformed(ActionEvent e) java.beans.PropertyChangeListener void propertyChange(PropertyChangeEvent evt) java.io.FileFilter boolean accept(File pathname) java.util.Comparator<T> int compare(T o1, T o2) javax.naming.spi.ObjectFactory Object getObjectInstance(.....)
  9. 9. someThing.addCallback( new Callback() { public int doit(int x) { return x *x; } });
  10. 10. someThing.addCallback( new Callback() { public int doit(int x) { return x *x; } });
  11. 11. someThing.addCallback( new Callback() { public int doit(int x) { return x *x; } });
  12. 12. someThing.addCallback( (int x) → { return x *x; } );
  13. 13. someThing.addCallback( (int x) → { return x *x; } );
  14. 14. someThing.addCallback( (int x) → { return x *x; } );
  15. 15. someThing.addCallback( (int x) → x *x );
  16. 16. someThing.addCallback( (int x) → x *x );
  17. 17. someThing.addCallback( (int x) → x *x );
  18. 18. someThing.addCallback( x → x *x );
  19. 19. someThing.addCallback( x → x *x );
  20. 20. someThing.addCallback( new Callback() { public int doit(int x) { return x *x; } });
  21. 21. someThing.addCallback( x → x *x );
  22. 22. (int a, int b) → { return a * b; } (int a, int b) → a* b; (a, b) → a* b; x → x * x;
  23. 23. λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
  24. 24. some.method(Integer::parseInt); Statische Methode
  25. 25. someList.forEach(MyClass::instMeth); someList.forEach( (MyClass e) → e.instMeth() ); Ungebundene Instanz-Methode
  26. 26. some.method(System.out::println); some.method(instance::instmethod); Gebundene Instanz-Methode
  27. 27. some.method(MyClass::new); some.method((x) -> new MyClass(x)); Konstruktor
  28. 28. λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
  29. 29. List<Point> points = …. Iterator<Point> it = points.iterator(); while(it.hasNext()) { Point p = it.next(); …. …. }
  30. 30. List<Point> points = …. Stream<Point> it = points.stream(); while(it.hasNext()) { Point p = it.next(); …. …. }
  31. 31. List<Point> points = …. X Stream<Point> it = points.stream(); X while(it.hasNext()) { Point p = it.next(); …. …. }
  32. 32. List<Point> points = …. points.stream() .map(p->p.x) .filter(v-> v > 0) .distinct() .forEach(out::println) ;
  33. 33. Point Point Point Point Point Point Point Point map p → p.x int Point Point Point int Point Point Point filter int int Point int v → v>0 distinct int Point foreach out::println
  34. 34. List<Point> points = …. points.stream() .map(p->p.x) .filter(v-> v > 0) .distinct() .forEach(out::println) ;
  35. 35. List<Point> points = …. points.parallelStream() .map(p->p.x) .filter(v-> v > 0) .distinct() .forEach(out::println) ;
  36. 36. λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
  37. 37. interface MyInterface { public int doit(int x); static int other(int x){ ...some Implementation } };
  38. 38. interface MyInterface { public int doit(int x); default int other(int x){ ...Implementation using this } };
  39. 39. λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
  40. 40. @FunctionalInterface interface MyInterface { public int doit(int x); };
  41. 41. package java.util.function @FunctionalInterface interface Function<T, R> { R apply(T t); };
  42. 42. package java.util.function @FunctionalInterface interface BiFunction<T, U, R> { R apply(T t, U u); };
  43. 43. package java.util.function @FunctionalInterface interface Consumer<T> { void accept(T t); };
  44. 44. package java.util.function @FunctionalInterface interface Supplier<T> { T get(); };
  45. 45. package java.util.function @FunctionalInterface interface Predicate<T> { boolean test(T t); };
  46. 46. Consumer<Integer> outp = (i) -> System.out.println(i); Function<String, Integer> fun = (s) -> s.length(); Supplier<String> value = () -> "Hello"; outp.accept(fun.apply(value.get()));
  47. 47. Consumer<Integer> outp = (i) -> System.out.println(i); Function<String, Integer> fun = (s) -> s.length(); Supplier<String> value = () -> "Hello"; outp ( fun ( value() ) );
  48. 48. λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
  49. 49. Weiterführendes: State of the Lambda – Brian Goetz erklärt die Java 8 Features. http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html Lambda – A peek under the hood http://www.youtube.com/watch?v=C_QbkGU_lqY&noredirect=1 Brian Goetz erklärt, wie Lambdas implementiert sind. Lambda/Streams Tutorial auf AngelikaLanger.com http://www.angelikalanger.com/Lambdas/Lambdas.html Lambda-FAQ von Maurice Naftalin http://www.lambdafaq.org Artikel von Angelika Langer und Klaus Kreft in Java Magazin 10.2013 und 11.2013 Java8 complete feature set http://openjdk.java.net/projects/jdk8/features
  50. 50. Weiterführendes: Netbeans 7.4 https://netbeans.org/community/releases/74/ Java 8 Early Access https://jdk8.java.net/download.html Online Compiler – Try Java 8 http://www.tryjava8.com Java 8 Lambdas in Action (MEAP) Raoul-Gabriel Urma, Mario Fusco, and Alan Mycroft http://www.manning.com
  51. 51. forEach( (Aufmerksamkeit) → Vielen Dank )
  52. 52. Dirk Detering ©2013 Version 0.7 Dieses Projekt ist lizensiert als Inhalt der Creative Commons Namensnennung - Nicht-kommerziell Weitergabe unter gleichen Bedingungen 3.0 Deutschland-Lizenz. Um eine Kopie der Lizenz zu sehen, besuchen Sie http://creativecommons.org/licenses/by-nc-sa/3.0/de/. Java is a registered trademark of Oracle and/or its affiliates.

Editor's Notes

  • Python 1.0 Jan. 94 / 1.5 Jan.98
    (Lambda)
    Ruby 95 ich: Ruby 1.6 Jahr: 2000
    (Blocks, Lambda Keyword)
    Groovy „Closures“ - schlechter Name
    Scala : Funktionen
    Umfrage: Wer kennt diese ?
    Haskell, Erlang, Lisp, Clojure?
    JavaScript?
  • AGENDA:
    KEIN VOLLUMFANG JAVA8
    (API, Annotations, Nashorn, JavaFX, VM)
    KEIN Ersatz für Schulung
    Keine Einführung in FP
    Wesentlich: COLLECTIONS als kurzfristiges Ziel.
    Langfristig:
    Java ist auf dem Weg zur FUNCTIONAL Language
  • Grösster Wurf seit (mind.) Java 1.5
    Neues Paradigma, Umlernen
    Java kommt spät!!
  • C# als „Nachahmung“ hat Java überholt!!
  • Verschiedene Herangehensweisen:
    Lambda Calculus (akademisch)
    Code-as-Data
    HIER: Syntax und Ableitung von Bisher
  • Lambda = Anonyme Funktion
    „Anonyme Methode“
    Syntax Vereinfachung
    Target Typing
    Noch mehr Vereinfachung
  • Prototypisches Interface
    Single Abstract Method (SAM)
  • SAM Interfaces.
    Künftig FunctionalInterfaces (Kandidaten)
    BLOCK
    SUPPLIER (Lieferanten)
    CONSUMER (Konsumenten)
    PREDICATE
    FUNCTION (Transformation)
  • „Was bisher geschah ...“
  • Reduktion um Unnötiges
  • Formatierung des neuen Lambda-Codes
  • Reduktion um unnötige Lambda-Syntax
    IN DIESEM FALL anwendbar
  • VOILA !!
    Nochmal der Vorher-Nachher Vergleich:
  • Closure → Referenz auf Umgebung
    Effectively Final
  • Method Handles bereits in Java 7
    Zusammenspiel mit invokedynamic
    Reflektives API ähnlich java.lang.reflection.Method
    Nun als Syntax verfügbar!!
  • Syntax: Receiver :: Method
  • Hier interessant: Instanz kann THIS sein !
    =&gt; Lambda compilierbar als private Methode!!
  • Callable&lt;MyClass&gt;:
    () =&gt; new MyClass();
    Function&lt;T,MyClass&gt; :
    (e:T):MyClass =&gt; new MyClass(e);
  • Paket java.util.stream
    Nicht verwechseln mit java.io.Stream
    Primäres kurzfristiges Ziel von Projekt Lambda!
    Wichtigster Anwendungsfall.
  • Point ist java.awt.Point mit Attributen x und y.
  • Stream abholen wie Iterator
    Aber NICHT zur Speicherung und direkten Bearbeitung.....
  • … sondern Nutzung als Fluent Interface
  • Point ist java.awt.Point , Attribute x und y.
    Liste := Punkte mit positiven und negativen Koordinaten ,
    Koordinaten jeweils ggf. doppelt.
    AUFGABE (aus Lambda-Tour):
    Finde alle Punkte mit positiven X-Werten und drucke die unterschiedlichen Werte.
    Streams formen PIPELINE
  • Streams formen PIPELINE
  • ACHTUNG: UMSTRUKTURIERUNG DES CODES zur Parallelisierung unter Nutzung des Fork/Join Frameworks.
  • Einfach parallelStream, um Fork/Join Version zu erhalten.
  • Aufgekommen durch Notwendigkeit, bestehende Interfaces (Collection) zu erweitern, dann aber auch alle Klassen anpassen zu müssen.
    Jetzt mehr als nur Notbehelf. Design Mittel
    Trait in Scala.
  • This bezieht sich auf Instanz der implementierenden Klasse.
    Typ von this: MyInterface !
  • Marker Annotation, ähnlich @Override
    Nicht notwendig um „Tatsachen zu schaffen“,
    Compiler prüft auf Einhaltung gewisser Regeln.
    z.B: nur eine abstrakte Methode
  • Eigentlich schon ausreichend, um funktionale Programmierung zu ermöglichen.
  • Zwei Parameter zur Abbildung von Funktionen im Sinne von binären Operationen.
    Spezialisierung:
    Operation : BiFunction&lt;T,T,T&gt;
  • Consumer, nicht pur Funktional.
    Parametertyp von forEach(..)
  • Parametertyp von .filter(..)
    UND: DIVERSE ABARTEN mit Primitiven
  • Notwendigkeit zum expliziten Aufruf der diversen Methoden.
  • Möchte man eigentlich so schreiben.
  • ZUSAMMENFASSUNG
    NICHT Gezeigt:
    Methoden von Function
    (andThen, combine, identity ….)
    Optional

×