50. 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
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 !
=> Lambda compilierbar als private Methode!!
Callable<MyClass>:
() => new MyClass();
Function<T,MyClass> :
(e:T):MyClass => 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<T,T,T>
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