Java 8. Lambdas und Streams. Dr. Jan Schäfer. Big Techday Mai 2014, München

Ähnliche Dokumente
Java 8. Guild42, 18. November Stephan Fischli Dozent BFH, Software-Architekt ISC-EJPD

Java 8 Lambdas und Streams

13. Funktionale Konzepte in Java

Java 8. Die wichtigsten Neuerungen. W3L AG

Java 8: Lambdas, Streams & Co

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Java 8. Lambdas und Streams

11. Funktionale Programmierung Advanced Programming Techniques Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

JUGS Java 8 Hands On Übungen

Java 8. Programmiermethodik. Eva Zangerle, Nikolaus Krismer Universität Innsbruck

Ich liebe Java && Ich liebe C# Rolf Borst

Java-Schulung Grundlagen

Klausur Grundlagen der Programmierung

Einstieg in die Informatik mit Java

Funktionale Programmierung mit Java. Manuel Mauky & Max Wielsch

Distributed Computing Group

Funktionale Konzepte in objektorientierten Sprachen LAMBDAS / CLOSURES

Dr. Monika Meiler. Inhalt

Wie entwerfe ich ein Programm?

Einführung in ActionScript

Große Übung Praktische Informatik 1

Neuerungen in Java 8. Wichtige neue Features im Überblick. Folie Michael Inden

Beispiel: DB-Mock (1/7)

Groovy für Java Programmierer. 20. Juli Stefan Kolatzki

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Programmiertechnik II Klausur WS 15/16 Angewandte Informatik Bachelor

Programmieren I + II Regeln der Code-Formatierung

System.out.println("TEXT");

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Algorithmen und Datenstrukturen

Neue Features in C# 2.0

Einführung in die Informatik

Primitive Datentypen

Repetitorium Informatik (Java)

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Beispiel für überladene Methode

Probeklausur: Programmierung WS04/05

Versuchsziele. Grundlagen. Überblick: FB Automatisierung und Informatik Betriebssysteme Thema: Bounded-Buffer-Problem. 3.

5.5.8 Öffentliche und private Eigenschaften

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

1 Abstrakte Klassen, finale Klassen und Interfaces

Entwurfsmuster und Frameworks Singleton

Funktionale Programmiersprachen

1.3 Welche Schritte werden bei der Programmerstellung benötigt? 1.5 Was sind Variablen im Kontext der Programmierung?

Objektorientierte Programmierung

JAVA für Nichtinformatiker - Probeklausur -

Parallele und funktionale Programmierung Wintersemester 2015/ Übung Abgabe bis , 10:00 Uhr

Probeklausur: Programmierung WS04/05

Programmieren in Java

Tutorium zur Vorlesung Programmieren

Java Beans.

Scala: Klassen, Methoden und Objekte. von Simon Lerch

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Einstieg in die Informatik mit Java

1 Polymorphie (Vielgestaltigkeit)

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Java Programmierung Aufbau

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

ALP II Dynamische Datenmengen

Softwaretechnik WS 16/17. Übungsblatt 01

II.4.1 Unterklassen und Vererbung - 1 -

Datenbankanwendungsprogrammierung Crashkurs Java

Höhere Programmierkonzepte Testklausur

Java 8. Programmiermethodik. Eva Zangerle, Nikolaus Krismer Universität Innsbruck

JAVA - Zufallszahlen

Beispiel: Temperaturumwandlung. Imperative Programmierung. Schwerpunkte. 3. Grundlegende Sprachkonstruktionen imperativer Programme

Software-Architektur Reactive Streams

II.3.1 Rekursive Algorithmen - 1 -

Musterlösungen zur Klausur Informatik 3

Einführung in die Programmierung Blockkurs Java

Info B VL 8: Abstrakte Klassen & Interfaces

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Programmieren 2 Java Überblick

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

C# im Vergleich zu Java

Objektorientierte Programmierung

Vererbung. Martin Wirsing. Ziele. Vererbung

Hilfsblatt für C++ Prüfungen im 5. Semester

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

public class SternchenRechteckGefuellt {

Klausur Software-Entwicklung September 00

Vererbung und Traits

Java Einführung Abstrakte Klassen und Interfaces

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Die for -Schleife HEUTE. Schleifen. Arrays. Schleifen in JAVA. while, do reichen aus, um alle iterativen Algorithmen zu beschreiben

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Inhaltsverzeichnis 1 Einführung Die Software JGIS Grundlagen raumbezogener Daten

Android Processes & Services

2.2 Prozesse in Java

Schnittstellen, Stack und Queue

Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

5. Tutorium zu Programmieren

Transkript:

Java 8 Lambdas und Streams Dr. Jan Schäfer Big Techday 7 23. Mai 2014, München

Warum sollte mich Java 8 interessieren? Java ist eine der meistverwendeten Programmiersprachen, insbesondere bei Enterprise-Software Java 8 ist das größte Java-Release seit mindestens 10 Jahren (seit Java 5)

Neue Features in Java 8 Spracherweiterungen Lambda-Literale Functional Interfaces Methodenreferenzen Defaultmethoden in Interfaces (Virtual Extension Methods) Statische Methoden in Interfaces Verbesserte Typinferenz Annotationserweiterungen

Neue Features in Java 8 (Forts.) Bibliothekserweiterungen Erweiterungen für Lambdas Streams Neue Zeit- und Datums-API Neue Concurrency-Klassen... Sonstiges Neue Javascript Engine (Nashorn)...

Focus des Talks Lambdas und Streams

Lambdas - Warum? Funktionale, zustandslose Programmierung Asynchrone, event-basierte Programmierung Parallele Programmierung Higher-Order Programmierung

-Literale new 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

Target Typing x -> x + x // Typ?? Der Typ eines Lambda-Ausdrucks wird anhand des Ziel-Typen ermittelt 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 functional interface.

Functional Interfaces Interfaces mit genau einer abstrakten Methode @FunctionalInterface public interface MyFunction { String foobar(string s); MyFunction fun = x -> x + x; // OK

Functional Interfaces Existierende 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);...

Functional Interfaces java.util.function Interface Function<S,T> UnaryOperator<S> Consumer<S> Predicate<S> Supplier<T> Typ (S) => T (S) => S (S) => void (S) => boolean () => T BiFunction<R,S,T> (R,S) => T BinaryOperator<S> (S,S) => S

Functional Interfaces (Forts.) Interface IntFunction<S> ToIntFunction<S> Typ (int) => S (S) => int ToIntBiFunction<S,T> (S,T) => int IntUnaryOperator IntConsumer IntPredicate IntSupplier IntToLongFunction IntToDoubleFunction (int) => int (int) => void (int) => boolean () => int (int) => long (int) => double Long..., Double...

Variable Capturing int foo = 42; return x -> x + foo; Variablen aus dem Kontext können benutzt werden wenn sie "Effectively Final" sind

Kein eigener Scope int x = 42; return x -> x; ERROR: Lambda expression's parameter x cannot redeclare another local variable defined in an enclosing scope.

This und Super class Foo { int x; IntSupplier supplyx() { return () -> this.x; this und super referenzieren den äußeren Kontext

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") );

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();

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;

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) );

Methodenreferenzen Statische Methoden IntUnaryOperator abs = Math::abs; int absint = abs.applyasint(-5); Konstruktoren Supplier<List<String>> newlist = ArrayList::new; List<String> list = newlist.get();

Methodenreferenzen (Forts.) Instanzmethoden mit Objekt String string = "foo"; Supplier<String> fun = string::touppercase; String uppercase = fun.get(); Instanzmethoden mit Typ Function<String,String> fun = String::toUpperCase; String uppercase = fun.apply("foo");

Externe vs. Interne Iteration Externe Iteration (Wie + Was) for (String s : list) { System.out.println(s); Interne Iteration (Was) list.foreach( s -> { System.out.println(s); );

Iterable.forEach Default-Implementierung public interface Iterable<T> {... default void foreach(consumer<? super T> action) { for (T t : this) { action.accept(t);

Streams Interne Iteration auf Steroiden Schnittstelle zum Verarbeiten von gleichförmigen Datenströmen Kein eigener Datenspeicher (benötigt unterliegende Datenquelle) Funktional (unterliegende Daten werden nicht verändert) Können unendlich sein Werden genau einmal konsumiert (danach nicht mehr verwendbar) Lazy (Auswertung erst dann wenn wirklich angefordert) Parallelisierbar

Beispiel (Java 7) Gib eine sortierte Liste aller Dateien im Root-Verzeichnis aus, die mit "s" anfangen. 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);

Beispiel (Java 8) Gib eine sortierte Liste aller Dateien im Root-Verzeichnis aus, die mit "s" anfangen. Java 8 Files.list(Paths.get("/")).map(Path::toString).filter(s -> s.startswith("/s")).sorted().foreach(system.out::println);

Stream Pipeline Datenquelle Zwischenoperation... Zwischenoperation Terminale Operation

Beispiel // Datenquelle Files.list(Paths.get("/")) // Zwischenoperation.map(Path::toString) // Zwischenoperation.filter(s -> s.startswith("/s")) // Zwischenoperation.sorted() // Terminale Operation.forEach(System.out::println);

Datenquellen Alle Collections durch die neue stream() Methode Stream.iterate(), Stream.generate(), IntStream.range(0,10) new Random().longs()...

Zwischenoperationen Geben wieder einen Stream zurück Sind Lazy (Auswertung erst wenn angefordert) Zustandslos: z.b. map, filter Zustandsbehaftet: z.b. sorted, distinct

Terminale Operationen Triggern die Auswertung des Streams Konsumieren den Stream Zustandslos: findfirst, reduce, foreach Zustandsbehaftet: collect Ohne terminale Operation KEINE Auswertung!

Beispiel: map ohne terminale Operation Stream.of(1, 2, 3, 4).map((x) -> { System.out.println(x); return x; ); Ausgabe:

Beispiel: map und foreach Stream.of(1, 2, 3, 4).map((x) -> { System.out.println("map: " + x); return x; ).foreach((x) -> { // terminale Operation System.out.println("forEach: " + x); ); map: 1 foreach: 1 map: 2 foreach: 2 map: 3 foreach: 3 map: 4 foreach: 4 Ausgabe:

foreach 1 2 3 4 Stream.of(1, 2, 3, 4).forEach(System.out::println); // terminal Ausgabe:

reduce Zustandslose Reduktion int sum = Stream.of(1, 2, 3, 4).reduce((x,y) -> x+y).get(); System.out.println(sum); 10 Ausgabe:

collect Reduktion 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)); {false=[1, 3], true=[2, 4] Ergebnis:

Unendliche Streams new 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);

Parallele Verarbeitung 3 1 4 5 2 Arrays.asList(1,2,3,4,5).parallelStream().forEach(System.out::println); Ausgabe:

Parallele Verarbeitung Einschränkungen Ein gemeinsamer Thread-Pool für ALLE Streams! Anzahl der Threads nicht konfigurierbar (-> Anzahl Prozessoren) Operationen sollten zustandslos sein und keine Locks halten

Fazit Das Warten hat sich gelohnt! Lambdas sind gut gelungen Sehr viele Anwendungsmöglichkeiten Streams können sehr viele for und while-schleifen ersetzen Extrem einfache (eingeschränkte) parallele Verarbeitung Aber Das Mindset des Programmierers muss sich ändern!

Dank An Java 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)

Fragen? jan.schaefer@tngtech.com

Vertiefende Lesetipps Oracle Java 8 Tutorial: Tutorial von Angelika Langer: http://docs.oracle.com/javase/tutorial/ http://www.angelikalanger.com/lambdas/lambdas.html Buch: Functional Programming in Java. Venkat Subramaniam. The Pragmatic Programmers, 2014 Buch: Java 8 Lambdas. Richard Warburton. O'Reilly Media, 2014