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