Java8 Neue Sprachfeatures - Lambda/Streams/default Methods/FunctionalInterfaces
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 1,529 views

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

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

Statistics

Views

Total Views
1,529
Views on SlideShare
1,307
Embed Views
222

Actions

Likes
0
Downloads
26
Comments
0

6 Embeds 222

http://thedet.wordpress.com 209
http://cloud.feedly.com 7
http://feedly.com 2
http://prlog.ru 2
http://inoreader.com 1
https://commafeed-elehack.rhcloud.com 1

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Python 1.0 Jan. 94 / 1.5 Jan.98 <br /> (Lambda) <br /> Ruby 95 ich: Ruby 1.6 Jahr: 2000 <br /> (Blocks, Lambda Keyword) <br /> Groovy „Closures“ - schlechter Name <br /> Scala : Funktionen <br /> Umfrage: Wer kennt diese ? <br /> Haskell, Erlang, Lisp, Clojure? <br /> JavaScript? <br />
  • AGENDA: <br /> KEIN VOLLUMFANG JAVA8 <br /> (API, Annotations, Nashorn, JavaFX, VM) <br /> KEIN Ersatz für Schulung <br /> Keine Einführung in FP <br /> Wesentlich: COLLECTIONS als kurzfristiges Ziel. <br /> Langfristig: <br /> Java ist auf dem Weg zur FUNCTIONAL Language <br />
  • Grösster Wurf seit (mind.) Java 1.5 <br /> Neues Paradigma, Umlernen <br /> Java kommt spät!! <br />
  • C# als „Nachahmung“ hat Java überholt!! <br />
  • Verschiedene Herangehensweisen: <br /> Lambda Calculus (akademisch) <br /> Code-as-Data <br /> HIER: Syntax und Ableitung von Bisher <br />
  • Lambda = Anonyme Funktion <br /> „Anonyme Methode“ <br /> Syntax Vereinfachung <br /> Target Typing <br /> Noch mehr Vereinfachung <br />
  • Prototypisches Interface <br /> Single Abstract Method (SAM) <br />
  • SAM Interfaces. <br /> Künftig FunctionalInterfaces (Kandidaten) <br /> BLOCK <br /> SUPPLIER (Lieferanten) <br /> CONSUMER (Konsumenten) <br /> PREDICATE <br /> FUNCTION (Transformation) <br />
  • „Was bisher geschah ...“ <br />
  • Reduktion um Unnötiges <br />
  • Formatierung des neuen Lambda-Codes <br />
  • Reduktion um unnötige Lambda-Syntax <br /> IN DIESEM FALL anwendbar <br />
  • VOILA !! <br /> Nochmal der Vorher-Nachher Vergleich: <br />
  • Closure → Referenz auf Umgebung <br /> Effectively Final <br />
  • Method Handles bereits in Java 7 <br /> Zusammenspiel mit invokedynamic <br /> Reflektives API ähnlich java.lang.reflection.Method <br /> Nun als Syntax verfügbar!! <br />
  • Syntax: Receiver :: Method <br />
  • Hier interessant: Instanz kann THIS sein ! <br /> => Lambda compilierbar als private Methode!! <br />
  • Callable: <br /> () => new MyClass(); <br /> Function : <br /> (e:T):MyClass => new MyClass(e); <br />
  • Paket java.util.stream <br /> Nicht verwechseln mit java.io.Stream <br /> Primäres kurzfristiges Ziel von Projekt Lambda! <br /> Wichtigster Anwendungsfall. <br />
  • Point ist java.awt.Point mit Attributen x und y. <br />
  • Stream abholen wie Iterator <br /> Aber NICHT zur Speicherung und direkten Bearbeitung..... <br />
  • … sondern Nutzung als Fluent Interface <br />
  • Point ist java.awt.Point , Attribute x und y. <br /> Liste := Punkte mit positiven und negativen Koordinaten , <br /> Koordinaten jeweils ggf. doppelt. <br /> AUFGABE (aus Lambda-Tour): <br /> Finde alle Punkte mit positiven X-Werten und drucke die unterschiedlichen Werte. <br /> Streams formen PIPELINE <br />
  • Streams formen PIPELINE <br />
  • ACHTUNG: UMSTRUKTURIERUNG DES CODES zur Parallelisierung unter Nutzung des Fork/Join Frameworks. <br />
  • Einfach parallelStream, um Fork/Join Version zu erhalten. <br />
  • Aufgekommen durch Notwendigkeit, bestehende Interfaces (Collection) zu erweitern, dann aber auch alle Klassen anpassen zu müssen. <br /> Jetzt mehr als nur Notbehelf. Design Mittel <br /> Trait in Scala. <br />
  • This bezieht sich auf Instanz der implementierenden Klasse. <br /> Typ von this: MyInterface ! <br />
  • Marker Annotation, ähnlich @Override <br /> Nicht notwendig um „Tatsachen zu schaffen“, <br /> Compiler prüft auf Einhaltung gewisser Regeln. <br /> z.B: nur eine abstrakte Methode <br />
  • Eigentlich schon ausreichend, um funktionale Programmierung zu ermöglichen. <br />
  • Zwei Parameter zur Abbildung von Funktionen im Sinne von binären Operationen. <br /> Spezialisierung: <br /> Operation : BiFunction <br />
  • Consumer, nicht pur Funktional. <br /> Parametertyp von forEach(..) <br />
  • Parametertyp von .filter(..) <br /> UND: DIVERSE ABARTEN mit Primitiven <br />
  • Notwendigkeit zum expliziten Aufruf der diversen Methoden. <br />
  • Möchte man eigentlich so schreiben. <br />
  • ZUSAMMENFASSUNG <br /> NICHT Gezeigt: <br /> Methoden von Function <br /> (andThen, combine, identity ….) <br /> Optional <br />

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

  • 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.