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

•
•
•
•
•

?...
C# 3.0

C# 2.0
Generics

t

Extension Methods,
Lambdas

Nov. 2007

Feb. 2002
Java 1.4

•

•
•
•
•
•

Assert
------------Re...
λ 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 actionPerform...
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...
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>...
Consumer<Integer> outp =
(i) -> System.out.println(i);
Function<String, Integer> fun =
(s) -> s.length();
Supplier<String>...
λ 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/lam...
Weiterführendes:
Netbeans 7.4
https://netbeans.org/community/releases/74/
Java 8 Early Access
https://jdk8.java.net/downlo...
forEach( (Aufmerksamkeit) → Vielen Dank )
Dirk Detering ©2013
Version 0.7

Dieses Projekt ist lizensiert als Inhalt der Creative Commons Namensnennung - Nicht-komme...
Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces
Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces
Upcoming SlideShare
Loading in …5
×

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

3,819 views

Published on

(deutsch) Kurze Einführung in Java8 - neue Sprachfeatures rund um Lambda

Published in: Technology, News & Politics
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,819
On SlideShare
0
From Embeds
0
Number of Embeds
1,351
Actions
Shares
0
Downloads
37
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • 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
  • 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.

    ×