Neue Sprachfeatures
λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
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
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
λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
(int a, int b) → { return a * b; } (int a, int b) → a* b (a, b) → a* b x→ x*x
interface Callback { public int doit(int x); };
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(.....)
someThing.addCallback( new Callback() { public int doit(int x) { return x *x; } });
someThing.addCallback( new Callback() { public int doit(int x) { return x *x; } });
someThing.addCallback( new Callback() { public int doit(int x) { return x *x; } });
someThing.addCallback( (int x) → { return x *x; } );
someThing.addCallback( (int x) → { return x *x; } );
someThing.addCallback( (int x) → { return x *x; } );
someThing.addCallback( (int x) → x *x );
someThing.addCallback( (int x) → x *x );
someThing.addCallback( (int x) → x *x );
someThing.addCallback( x → x *x );
someThing.addCallback( x → x *x );
someThing.addCallback( new Callback() { public int doit(int x) { return x *x; } });
someThing.addCallback( x → x *x );
(int a, int b) → { return a * b; } (int a, int b) → a* b; (a, b) → a* b; x → x * x;
λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
some.method(Integer::parseInt); Statische Methode
someList.forEach(MyClass::instMeth); someList.forEach( (MyClass e) → e.instMeth() ); Ungebundene Instanz-Methode
some.method(System.out::println); some.method(instance::instmethod); Gebundene Instanz-Methode
some.method(MyClass::new); some.method((x) -> new MyClass(x)); Konstruktor
λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
List<Point> points = …. Iterator<Point> it = points.iterator(); while(it.hasNext()) { Point p = it.next(); …. …. }
List<Point> points = …. Stream<Point> it = points.stream(); while(it.hasNext()) { Point p = it.next(); …. …. }
List<Point> points = …. X Stream<Point> it = points.stream(); X while(it.hasNext()) { Point p = it.next(); …. …. }
List<Point> points = …. points.stream() .map(p->p.x) .filter(v-> v > 0) .distinct() .forEach(out::println) ;
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
List<Point> points = …. points.stream() .map(p->p.x) .filter(v-> v > 0) .distinct() .forEach(out::println) ;
List<Point> points = …. points.parallelStream() .map(p->p.x) .filter(v-> v > 0) .distinct() .forEach(out::println) ;
λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
interface MyInterface { public int doit(int x); static int other(int x){ ...some Implementation } };
interface MyInterface { public int doit(int x); default int other(int x){ ...Implementation using this } };
λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
@FunctionalInterface interface MyInterface { public int doit(int x); };
package java.util.function @FunctionalInterface interface Function<T, R> { R apply(T t); };
package java.util.function @FunctionalInterface interface BiFunction<T, U, R> { R apply(T t, U u); };
package java.util.function @FunctionalInterface interface Consumer<T> { void accept(T t); };
package java.util.function @FunctionalInterface interface Supplier<T> { T get(); };
package java.util.function @FunctionalInterface interface Predicate<T> { boolean test(T t); };
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()));
Consumer<Integer> outp = (i) -> System.out.println(i); Function<String, Integer> fun = (s) -> s.length(); Supplier<String> value = () -> "Hello"; outp ( fun ( value() ) );
λ Lambda-Ausdrücke Method::References Method default methods ≈≈ Streams @ FunctionalInterfaces
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
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
forEach( (Aufmerksamkeit) → Vielen Dank )
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.

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

Editor's Notes

  • #3 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?
  • #4 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
  • #5 Grösster Wurf seit (mind.) Java 1.5 Neues Paradigma, Umlernen Java kommt spät!!
  • #6 C# als „Nachahmung“ hat Java überholt!!
  • #7 Verschiedene Herangehensweisen: Lambda Calculus (akademisch) Code-as-Data HIER: Syntax und Ableitung von Bisher
  • #8 Lambda = Anonyme Funktion „Anonyme Methode“ Syntax Vereinfachung Target Typing Noch mehr Vereinfachung
  • #9 Prototypisches Interface Single Abstract Method (SAM)
  • #10 SAM Interfaces. Künftig FunctionalInterfaces (Kandidaten) BLOCK SUPPLIER (Lieferanten) CONSUMER (Konsumenten) PREDICATE FUNCTION (Transformation)
  • #11 „Was bisher geschah ...“
  • #12 Reduktion um Unnötiges
  • #15 Formatierung des neuen Lambda-Codes
  • #16 Reduktion um unnötige Lambda-Syntax IN DIESEM FALL anwendbar
  • #21 VOILA !! Nochmal der Vorher-Nachher Vergleich:
  • #22 Closure → Referenz auf Umgebung Effectively Final
  • #25 Method Handles bereits in Java 7 Zusammenspiel mit invokedynamic Reflektives API ähnlich java.lang.reflection.Method Nun als Syntax verfügbar!!
  • #26 Syntax: Receiver :: Method
  • #28 Hier interessant: Instanz kann THIS sein ! =&gt; Lambda compilierbar als private Methode!!
  • #29 Callable&lt;MyClass&gt;: () =&gt; new MyClass(); Function&lt;T,MyClass&gt; : (e:T):MyClass =&gt; new MyClass(e);
  • #30 Paket java.util.stream Nicht verwechseln mit java.io.Stream Primäres kurzfristiges Ziel von Projekt Lambda! Wichtigster Anwendungsfall.
  • #31 Point ist java.awt.Point mit Attributen x und y.
  • #32 Stream abholen wie Iterator Aber NICHT zur Speicherung und direkten Bearbeitung.....
  • #33 … sondern Nutzung als Fluent Interface
  • #34 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
  • #35 Streams formen PIPELINE
  • #36 ACHTUNG: UMSTRUKTURIERUNG DES CODES zur Parallelisierung unter Nutzung des Fork/Join Frameworks.
  • #37 Einfach parallelStream, um Fork/Join Version zu erhalten.
  • #39 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.
  • #40 This bezieht sich auf Instanz der implementierenden Klasse. Typ von this: MyInterface !
  • #42 Marker Annotation, ähnlich @Override Nicht notwendig um „Tatsachen zu schaffen“, Compiler prüft auf Einhaltung gewisser Regeln. z.B: nur eine abstrakte Methode
  • #43 Eigentlich schon ausreichend, um funktionale Programmierung zu ermöglichen.
  • #44 Zwei Parameter zur Abbildung von Funktionen im Sinne von binären Operationen. Spezialisierung: Operation : BiFunction&lt;T,T,T&gt;
  • #45 Consumer, nicht pur Funktional. Parametertyp von forEach(..)
  • #47 Parametertyp von .filter(..) UND: DIVERSE ABARTEN mit Primitiven
  • #48 Notwendigkeit zum expliziten Aufruf der diversen Methoden.
  • #49 Möchte man eigentlich so schreiben.
  • #50 ZUSAMMENFASSUNG NICHT Gezeigt: Methoden von Function (andThen, combine, identity ….) Optional