Java 8. Johannes Hellrich, Erik Fäßler. Oberseminar

Ähnliche Dokumente
Java-Schulung Grundlagen

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

Java für Computerlinguisten

Objektorientierte Programmierung

Einführung in ActionScript

1 Polymorphie (Vielgestaltigkeit)

Java - Programmierung - Objektorientierte Programmierung 1

Datenbankanwendungsprogrammierung Crashkurs Java

Allgemein: Klassen testbar machen. 5. Mocking. Mocks programmieren. Zusammenspiel von Klassen testen

JUGS Java 8 Hands On Übungen

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

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Programmieren in Java

Objektorientierte Programmierung

Themen. Web Service - Clients. Kommunikation zw. Web Services

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

Java-Programmierung. Remote Method Invocation - RMI

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Kapitel 6. Vererbung

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

Kapitel 6. Vererbung

Einführung in Javadoc

Client-Server-Beziehungen

Probeklausur: Programmierung WS04/05

Große Übung Praktische Informatik 1

3 Objektorientierte Konzepte in Java

Java für C++ Programmierer

Codegeneratoren mit Xtend , A. Arnold

Info: Standard DO-178B. 5. Mocking. Zusammenspiel von Klassen testen. Allgemein: Klassen testbar machen

A(T1) A(T2) A(T1) A(T2)

Java 8. Die wichtigsten Neuerungen. W3L AG

Auszug aus JAX-WS Folien

Kapitel 6. Vererbung

Java Generics & Collections

Objektorientierte Programmierung. Kapitel 12: Interfaces

Vorbereitungen Download. AVO-Übung 6. Beispiel. Slice. Varianten u.a. für Linux, Windows, OS X ICE-Dokumentation ICE-Binaries (inkl.

Type Erasure in Java 5. Helmi Jouini Institut für Theoretische Informatik Universität Karlsruhe

Varietékünstler Die Programmiersprache Scala. Jan Hermanns.

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

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

Klassenbeziehungen & Vererbung

JdbcTemplate

Algorithmen und Datenstrukturen

Java Schulung (Java 2 Java Development Kit 5 / 6)

Einführung in die Programmierung Blockkurs Java

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

Schnittstellen implementieren am Beispiel Suchbaum

3 Objektorientierte Konzepte in Java

Programmieren von Webinformationssystemen

Spec# Einführung. Formale Software-Entwicklung Seminar SS 07 Universität Karlsruhe Hilal Akbaba

Grundlagen von Python

Innere Klassen in Java

Theorie und Praxis einer JSON-RPC-basierten Web-API

Programmieren von Webinformationssystemen

Javakurs 2013 Objektorientierung

5. Tutorium zu Programmieren

C# im Vergleich zu Java

Scala & Lift. Ferenc Lajko

Java Einführung Abstrakte Klassen und Interfaces

Distributed Computing Group

Programmieren in Java

Interaktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten

Variablen manipulieren per JDI

Java 8 Lambdas und Streams

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

Formale Spezialisierungstechniken. am Beispiel des binären Baums. Hybride Programmiersprachen Daniel Krompass Berlin, 2009

Anwendung der Aspektorientierung : Security

Neue Features in C# 2.0

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Teil 1: Grundeigenschaften von Rechnern und Software

Schritt 4: Hallo Enterprise Bean

Smalltalk vs. Java c Chris Burkert Smalltalk versus Java

WebServices -reloaded-

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck

Software-Architektur Design Patterns

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Java Schulung. Objektorientierte Programmierung in Java Teil V: Die Java Collection Klassen. Prof. Dr. Nikolaus Wulff

1. Der Einstieg in Java. Was heißt Programmieren?

12) Generische Datenstrukturen

Beispiel: DB-Mock (1/7)

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

5.4 Klassen und Objekte

Funktionales Programmieren in Python

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Generische Datenstrukturen

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Dynamische Sprachen auf der JVM

Asynchrone Webservices mit Axis 1.x in Java

Programmierkurs Python I

EWA PHP Einführung, CMS Prinzipien

equals und hashcode SortedSet NavigableSet Assoziative Container Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester / 32

Repetitorium Informatik (Java)

13. Tutorium zu Programmieren

Programmieren in Java

12) Generische Datenstrukturen

Programmieren 2 Selbststudium Semesterwoche 6

Ruby - Objektorientiertes Scripting, aber richtig!

am Beispiel von JUnit

Praktisches API-Design

Meeting C++ C++11 R-Value Referenzen

Transkript:

Java 8 Johannes Hellrich, Erik Fäßler Oberseminar 29.6.2017

Quellen https://github.com/winterbe/java8-tutorial http://www.lambdafaq.org https://github.com/jooq

Größte Änderung: Funktionale Programmierung Lambdas Neue Interfaces Streams

Lambdas Alter Ansatz: Anonyme Innere Klassen Collections.sort(names, new Comparator<String>() { @Override public int compare(string a, String b) { return b.compareto(a); } } );

Lambdas Neu: Lambdas Besser als in Python (Typsicher!) Collections.sort(names, (String a, String b) -> { return b.compareto(a); } );

Lambdas Bei Einzeilern sind Klammern und return optional Achtung: ; entfällt! Collections.sort(names, (String a, String b) -> b.compareto(a) );

Lambdas Der Typ der Argumente ist für den Compiler zumeist aus dem Kontext klar und optional Collections.sort(names, (a, b) -> b.compareto(a) );

Lambdas: Scope Innerhalb des Lambdas sind lokale Variablen der Umgebung sichtbar, die sich wie eine final Variable verhalten Analog zu Anonymen Inneren Klassen, bei denen das final aber explizit stehen musste Voller Zugriff auf statische und Instanzfelder

Lambdas Beispiel: JeSemE API des Spark Webservers für HTTP Requests get("/api/similarity", (request, response) -> getassociation(request, db, DatabaseService.SIMILARITY_TABLE, false), new Gson()::toJson);

Referenzen auf Methoden/Konstruktoren :: ermöglicht Referenzen auf Methoden und Konstruktoren Erfordert passendes functional Interface ResponseTransformer rt = new Gson()::toJson; PersonFactory<Person> pf = Person::new;

package spark; Functional Interfaces @FunctionalInterface public interface ResponseTransformer { } /** * Method called for rendering the output. * * @param model object used to render output. * @return message that it is sent to client. * @throws java.lang.exception when render fails */ String render(object model) throws Exception;

Functional Interfaces Praktisch um Factories zu implementieren interface PersonFactory<P extends Person> { P create(string firstname, String lastname); } Haben genau eine (abstrakte) Methode Optionale Annotation @FunctionalInterface Grundalge für das Funktionieren von Lambdas!

Außerdem bei Interfaces: Default Methods interface Formula { double calculate(int a); } default double sqrt(int a) { return Math.sqrt(a); } Achtung: Nicht in Lambdas des entsprechenden Interfaces sichtbar L

Mehrfachvererbung bei Default Methods Mehrfachvererbung := Klasse hat 2 Interfaces mit Defaultmethode gleichen Namens Ein Interface ist Unterklasse des anderen -> Implementierung der Unterklasse wird genommen Interfaces unabhängig -> Klasse muss Methode überschreiben (Kann INTERFACE.super.NAME für Zugriff nutzen)

Wie nutze ich das? Funktionales Programmieren mit Java 8

Eingebaute Funktionale Interfaces Predicate<X> X -> boolean Function<X,Y> X -> Y Supplier<X> () -> X Consumer<X> X -> () Comparator<X> x1, x2 -> -1, 0, 1

Streams Datenströme im Zentrum Komponenten modifizieren diese Bekannte Idee aus der UNIX Kommandozeile oder NLP Pipelines echo "Viel zu heiß" sed "s/.*h//" tr "ß" "s"

Streams Wie bekomme ich einen Stream? Collection.stream() oder Stream.of(...) Streams sind typsicher, unterstützen Objekte über Generics und auch Primitive über extra Klassen

Filter filter(predicate) Stream.of(2,1,3).filter(x -> x > 1) Lässt nur Daten durch, die zu einem true führen

Sorted sorted() Stream.of(2,1,3).sorted() Bringt Daten in natürliche Ordnung Optionales Argument: Comparator

Map Map(Function) Stream.of(2,1,3).map(x -> x.tostring()) Wendet Funktion auf jedes Element des Datenstroms an Kann den Datentyp ändern

flatmap flatmap(function<x, Stream>) Entpackt komplexe Objekte in Streams, die dann kombiniert werden Stream.of(Arrays.asList(1,2), Arrays.asList(3,4)).flatMap(x ->x.stream())

Terminale Operationen any/all/nonematch(predicate): Testet Elemente des Datenstroms, ergibt Boolean count(): Anzahl der Elemente im Strom foreach(consumer): Wendet Consumer auf jedes Element an Stream.of(1,2,3).forEach(x -> println(x))

Terminale Operationen collect(collector) Wandelt Stream in Collection um, breite Auswahl in Collectors Stream.of(1,2,3).collect(Collectors.toList()) reduce(function): Benutzt Function um Elemente des Streams zu kombinieren, ergibt ein Optional Optional o = Stream.of(1,2,3).reduce((x,y) -> x+y)

Optional Optional<String> optional = Optional.of("bam"); optional.ispresent(); // true optional.get(); // "bam" optional.orelse("fallback"); // "bam" optional.ifpresent((s) -> System.out.println(s.charAt(0))); // "b"

Parallelität Collection.parallelStream() führt zu Streams die automatisch parallelisiert werden Kein Problem für Operationen die Elemente transformieren Terminale Operationen haben Varianten die sich um Ordnung/Kombination kümmern

Tricks zu Streams Endlich Zahlen Ranges in Java: IntStream.range(0, 20) Stream zu Iterator: Stream.iterator() Stream zu Iterable: for (String s : (Iterable<String>)stream::iterator)

NIO Files.lines(Paths.get(fileName)).map( ) Paths.get( teil, teil2,...) moderne Art auf Dateien zuzugreifen Files.lines(aPath) zeilenweiser Stream Files.list(aPathToDir) Dateien in Ordner als Stream Files.write(...) Schreibt Iterable in Datei

Weitere Neuerungen Neue Date API Annotationen Änderungen am Multithreading

Java 8 Johannes Hellrich, Erik Fäßler Oberseminar 29.6.2017

Ein großes Beispiel String[] mostsimilar = executor.invokeall(arrays.aslist( getmostsimilarasync(true, db, corpus, word), getmostsimilarasync(false, db, corpus, word)) ).stream(). map( future -> { try { return future.get(); } catch (final Exception e) {throw new IllegalStateException(e); } }). flatmap(list::stream). distinct(). toarray(string[]::new);

Noch ein großes Beispiel Function<Integer, String> fname = num -> fields.get(num).get(juliexmlconstants.name); row.put(fname.apply(0), results.docid); row.put(fname.apply(1), results.data); log.trace("{}={}", fname.apply(0), results.docid); log.trace("{}={}", fname.apply(1), results.data); if (results.getclass().equals(documentxmidata.class)) { DocumentXmiData docresults = (DocumentXmiData) results; row.put(fname.apply(2), docresults.newxmiid); row.put(fname.apply(3), docresults.serializedsofaxmiidmap); log.trace("{}={}", fname.apply(2), docresults.newxmiid); log.trace("{}={}", fname.apply(3), docresults.serializedsofaxmiidmap); } else { // for subsets we want to store if there is data at all row.put(fname.apply(2), results.data!= null); log.trace("{}={}", fname.apply(2), results.data!= null); }

Scala JVM Sprache Entwickelt an der EPFL von Martin Odersky Funktional & Objektorientiert Vorlage für viele Featues in Java 8 (Streams, Interfaces mit Methoden) Sehr kluger aber langsamer Kompiler

Was Java noch aus Scala übernehmen könnte Blöcke/Verzweigungen die automatisch zurückgeben Integer i = { if(true) 19 else 23 }

Was Java noch aus Scala Pattern matching übernehmen könnte x = expr match { case ("porridge", _) "eating case ("chair", "Mama") "sitting" case ("bed", "Baby") "sleeping case _ "what? }

Was Java noch aus Scala Implizite Parameter übernehmen könnte class KoanIntWrapper(val original: Int) { def isodd = original % 2!= 0 } implicit def foo (value: Int) = new KoanIntWrapper(value) 19.isOdd == true

Was Java noch aus Scala übernehmen könnte Generics mit besserer Berücksichtigung von Über-/Untertypen Echte Monaden statt Streams