Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order...
Transcript of Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order...
![Page 1: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/1.jpg)
Java 8Lambdas und Streams
Dr. Jan Schäfer
Big Techday 723. Mai 2014, München
![Page 2: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/2.jpg)
Warum sollte mich Java 8interessieren?
Java ist eine der meistverwendeten Programmiersprachen,insbesondere bei Enterprise-SoftwareJava 8 ist das größte Java-Release seit mindestens 10 Jahren(seit Java 5)
![Page 3: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/3.jpg)
Neue Features in Java 8Spracherweiterungen
Lambda-LiteraleFunctional InterfacesMethodenreferenzenDefaultmethoden in Interfaces (Virtual Extension Methods)Statische Methoden in InterfacesVerbesserte TypinferenzAnnotationserweiterungen
![Page 4: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/4.jpg)
Neue Features in Java 8 (Forts.)Bibliothekserweiterungen
Erweiterungen für LambdasStreamsNeue Zeit- und Datums-APINeue Concurrency-Klassen...
Sonstiges
Neue Javascript Engine (Nashorn)...
![Page 5: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/5.jpg)
Focus des TalksLambdas und Streams
![Page 6: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/6.jpg)
![Page 7: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/7.jpg)
Lambdas - Warum?Funktionale, zustandslose ProgrammierungAsynchrone, event-basierte ProgrammierungParallele ProgrammierungHigher-Order Programmierung
![Page 8: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/8.jpg)
-Literalenew Function<String,String>() { public String apply(String s) { return "Hello" + s; }}
(String s) -> { return "Hello" + s; }
(String s) -> "Hello" + s
(s) -> "Hello" + s
s -> "Hello" + s
![Page 9: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/9.jpg)
Target Typingx -> x + x // Typ??
Der Typ eines Lambda-Ausdrucks wird anhand des Ziel-Typenermittelt
IntUnaryOperator fun = x -> x + x;
interface IntUnaryOperator { int apply(int i); // (int) => int}
Object o = x -> x + x;
ERROR: Target type of this expression must be a functionalinterface.
![Page 10: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/10.jpg)
Functional InterfacesInterfaces mit genau einer abstrakten Methode
@FunctionalInterfacepublic interface MyFunction { String fooBar(String s);}
MyFunction fun = x -> x + x; // OK
![Page 11: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/11.jpg)
Functional InterfacesExistierende Functional Interfaces in Java < 8
java.lang.Runnable { void run(); }
java.util.Comparator<T> { int compare(T o1, T o2);}
java.io.FileFilter { boolean accept(File file); }
java.awt.event.ActionListener { void actionPerformed(ActionEvent e);}
...
![Page 12: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/12.jpg)
Functional Interfacesjava.util.function
Interface Typ
Function<S,T> (S) => T
UnaryOperator<S> (S) => S
Consumer<S> (S) => void
Predicate<S> (S) => boolean
Supplier<T> () => T
BiFunction<R,S,T> (R,S) => T
BinaryOperator<S> (S,S) => S
![Page 13: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/13.jpg)
Functional Interfaces (Forts.)Interface Typ
IntFunction<S> (int) => S
ToIntFunction<S> (S) => int
ToIntBiFunction<S,T> (S,T) => int
IntUnaryOperator (int) => int
IntConsumer (int) => void
IntPredicate (int) => boolean
IntSupplier () => int
IntToLongFunction (int) => long
IntToDoubleFunction (int) => double
Long..., Double...
![Page 14: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/14.jpg)
Variable Capturingint foo = 42;return x -> x + foo;
Variablen aus dem Kontext können benutzt werden wenn sie"Effectively Final" sind
![Page 15: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/15.jpg)
Kein eigener Scopeint x = 42;return x -> x;
ERROR: Lambda expression's parameter x cannot redeclareanother local variable defined in an enclosing scope.
![Page 16: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/16.jpg)
This und Superclass Foo { int x; IntSupplier supplyX() { return () -> this.x; }}
this und super referenzieren den äußeren Kontext
![Page 17: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/17.jpg)
Anwendungsbeispiele (1/3)Event-Basierte Programmierung
Java < 8
btn.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent event) { label.setText("Hallo Java 7"); }}
Java 8
btn.addActionListener( (event) -> label.setText("Hallo Java 8") );
![Page 18: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/18.jpg)
Anwendungsbeispiele (2/3)Thread-Erzeugung
Java < 8
new Thread(new Runnable() { public void run() { System.out.println("Thread started"); }}).start();
Java 8
new Thread(() -> System.out.println("Thread started")).start();
![Page 19: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/19.jpg)
Anwendungsbeispiele (3/3)Resource Handling (Java < 8)
Output someMethod1(Input input) { try (Connection conn = ds.getConnection()) { return doSomething1(input, conn); } catch (RuntimeException e) { log(e); throw e; }}
Output someMethod2(Input input) { try (Connection conn = ds.getConnection()) { return doSomething2(input, conn); } catch (RuntimeException e) { log(e); throw e; }}
![Page 20: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/20.jpg)
Anwendungsbeispiele (3/3)Resource Handling (Java 8)
<T> T withConn( Function<Connection, T> fun ) { try (Connection conn = ds.getConnection()) { return fun.apply(conn); } catch (RuntimeException e) { log(e); throw e; }}
Output someMethod1(Input input) { return withConn( conn -> doSomething1(input, conn) );}
Output someMethod2(Input input) { return withConn( conn -> doSomething2(input, conn) );}
![Page 21: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/21.jpg)
MethodenreferenzenStatische Methoden
IntUnaryOperator abs = Math::abs;int absInt = abs.applyAsInt(-5);
KonstruktorenSupplier<List<String>> newList = ArrayList::new;List<String> list = newList.get();
![Page 22: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/22.jpg)
Methodenreferenzen (Forts.)Instanzmethoden mit Objekt
String string = "foo";Supplier<String> fun = string::toUpperCase;String upperCase = fun.get();
Instanzmethoden mit TypFunction<String,String> fun = String::toUpperCase;String upperCase = fun.apply("foo");
![Page 23: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/23.jpg)
![Page 24: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/24.jpg)
Externe vs. Interne IterationExterne Iteration (Wie + Was)
for (String s : list) { System.out.println(s);}
Interne Iteration (Was)list.forEach( s -> { System.out.println(s);});
![Page 25: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/25.jpg)
Iterable.forEachDefault-Implementierung
public interface Iterable<T> { ... default void forEach(Consumer<? super T> action) { for (T t : this) { action.accept(t); } }}
![Page 26: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/26.jpg)
StreamsInterne Iteration auf Steroiden
Schnittstelle zum Verarbeiten von gleichförmigen DatenströmenKein eigener Datenspeicher (benötigt unterliegende Datenquelle)Funktional (unterliegende Daten werden nicht verändert)Können unendlich seinWerden genau einmal konsumiert (danach nicht mehrverwendbar)Lazy (Auswertung erst dann wenn wirklich angefordert)Parallelisierbar
![Page 27: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/27.jpg)
Gib eine sortierte Liste aller Dateien im Root-Verzeichnis aus, die mit"s" anfangen.
Beispiel (Java 7)
Java 7
List<String> strings = new ArrayList<>();for (File file : new File("/").listFiles()) { String s = file.toString(); if (s.startsWith("/s")) { strings.add(s); }}Collections.sort(strings);for (String s : strings) { System.out.println(s);}
![Page 28: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/28.jpg)
Gib eine sortierte Liste aller Dateien im Root-Verzeichnis aus, die mit"s" anfangen.
Beispiel (Java 8)
Java 8
Files.list(Paths.get("/")) .map(Path::toString) .filter(s -> s.startsWith("/s")) .sorted() .forEach(System.out::println);
![Page 29: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/29.jpg)
Stream PipelineDatenquelle
Zwischenoperation
...
Zwischenoperation
Terminale Operation
![Page 30: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/30.jpg)
Beispiel// DatenquelleFiles.list(Paths.get("/"))
// Zwischenoperation .map(Path::toString)
// Zwischenoperation .filter(s -> s.startsWith("/s"))
// Zwischenoperation .sorted()
// Terminale Operation .forEach(System.out::println);
![Page 31: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/31.jpg)
DatenquellenAlle Collections durch die neue stream() MethodeStream.iterate(), Stream.generate(), IntStream.range(0,10)new Random().longs()...
![Page 32: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/32.jpg)
ZwischenoperationenGeben wieder einen Stream zurückSind Lazy (Auswertung erst wenn angefordert)Zustandslos: z.B. map, filterZustandsbehaftet: z.B. sorted, distinct
![Page 33: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/33.jpg)
Terminale OperationenTriggern die Auswertung des StreamsKonsumieren den StreamZustandslos: findFirst, reduce, forEachZustandsbehaftet: collect
Ohne terminale Operation KEINE Auswertung!
![Page 34: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/34.jpg)
Beispiel: map ohne terminaleOperation
Stream.of(1, 2, 3, 4) .map((x) -> { System.out.println(x); return x; });
Ausgabe:
![Page 35: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/35.jpg)
Beispiel: map und forEachStream.of(1, 2, 3, 4) .map((x) -> { System.out.println("map: " + x); return x; }) .forEach((x) -> { // terminale Operation System.out.println("forEach: " + x); });
Ausgabe:map: 1forEach: 1map: 2forEach: 2map: 3forEach: 3map: 4forEach: 4
![Page 36: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/36.jpg)
forEachStream.of(1, 2, 3, 4) .forEach(System.out::println); // terminal
Ausgabe:
1234
![Page 37: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/37.jpg)
reduceZustandslose Reduktion
int sum = Stream.of(1, 2, 3, 4) .reduce((x,y) -> x+y) .get();System.out.println(sum);
Ausgabe:
10
![Page 38: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/38.jpg)
collectReduktion mit veränderlichem Zustand
List<Integer> result = Stream.of(1, 2, 3, 4) .collect(Collectors.toList());
Map<Boolean, List<Integer>> oddsEven = Stream.of(1, 2, 3, 4) .collect(Collectors.groupingBy( i -> i % 2 == 0));
Ergebnis:
{false=[1, 3], true=[2, 4]}
![Page 39: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/39.jpg)
Unendliche Streamsnew Random().ints() .forEach(System.out::println);
Stream.iterate(0, i -> i + 2) .forEach(System.out::println);
limit(n)
Stream.iterate(0, i -> i + 2) .limit(10) // Achtung bei Parallelverarbeitung! .forEach(System.out::println);
![Page 40: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/40.jpg)
Parallele VerarbeitungArrays.asList(1,2,3,4,5) .parallelStream() .forEach(System.out::println);
Ausgabe:
31452
![Page 41: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/41.jpg)
Parallele VerarbeitungEinschränkungen
Ein gemeinsamer Thread-Pool für ALLE Streams!Anzahl der Threads nicht konfigurierbar (-> AnzahlProzessoren)Operationen sollten zustandslos sein und keine Locks halten
![Page 42: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/42.jpg)
FazitDas Warten hat sich gelohnt!Lambdas sind gut gelungenSehr viele AnwendungsmöglichkeitenStreams können sehr viele for und while-Schleifen ersetzenExtrem einfache (eingeschränkte) parallele Verarbeitung
Aber
Das Mindset des Programmierers muss sich ändern!
![Page 43: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/43.jpg)
Dank AnJava 8 Techday Series
Eric Weikl, Peter Gafert (Überblick)Eckhard Maass, Manfred Hanke (Lambdas)Achim Herwig, René Scheibe (Streams)Michael Echerer und Andreas Schmid (Date + Time API)
![Page 45: Java 8 - TNG...Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung-Literale new Function() ... Extrem einfache (eingeschränkte)](https://reader036.fdocument.pub/reader036/viewer/2022062311/5f7a868df9e3cf7bf9571088/html5/thumbnails/45.jpg)
Vertiefende LesetippsOracle Java 8 Tutorial: Tutorial von Angelika Langer:
Buch: Functional Programming in Java. Venkat Subramaniam.The Pragmatic Programmers, 2014Buch: Java 8 Lambdas. Richard Warburton. O'Reilly Media, 2014
http://docs.oracle.com/javase/tutorial/
http://www.angelikalanger.com/Lambdas/Lambdas.html