Neuerungen in Java 8. Eric Giese adesso AG

Ähnliche Dokumente
Lambda Expressions in Java 8

Java 8. basierend auf Folien von Florian Erhard

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

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

Java 8 Lambdas und Streams

Java 8 Lambdas und Streams

Java SE 8 New Features. Dirk Reinemann Working Student Sales Consulting

Java für C++ Programmierer

Java 8. Die wichtigsten Neuerungen. W3L AG

11 Lambda-Ausdrücke. Beispiel: Sortierung nach Länge und kommaseparierte Aufbereitung

Javakurs für Fortgeschrittene

Java-Schulung Grundlagen

OCP Java SE 8. Lambda

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

Programmieren in Java -Eingangstest-

Programmieren in Java

Java: Kapitel 1. Überblick. Programmentwicklung WS 2008/2009. Holger Röder Holger Röder

Ich liebe Java && Ich liebe C# Rolf Borst

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

II.1.1. Erste Schritte - 1 -

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

JUGS Java 8 Hands On Übungen

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

RAP vs. GWT vs. GAE/J + jquery. Web Technologien im Verlgeich

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Programmiertechnik II WS 2017/18

II.1.1. Erste Schritte - 1 -

Programmiertechnik II SS Fakultät Informatik Bachelor Angewandte Informatik

Java Tools JDK. IDEs. Downloads. Eclipse. IntelliJ. NetBeans. Java SE 8 Java SE 8 Documentation

Android will doch nur spielen. Java Eine kurze Einführung

EINFÜHRUNG IN DIE PROGRAMMIERUNG

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

Skriptsprachen im Vormarsch: Einsatz in Enterprise-Applikationen. W3L AG

Validation und Quick Fixing mit Xtend. 3. Dezember 2014

Bean-Mapping mit MapStruct

Programmierkurs Java

Funktionale und Objekt-Orientierte Programmierkonzepte

13. Funktionale Konzepte in Java

Entwicklung der Programmiersprache C#

Funktionale Programmierung mit Java. Manuel Mauky & Max Wielsch

Grundlagen der Informatik für Ingenieure I

Programmierkurs Java

Grundlagen von JAVA Hello World in JAVA Elementare Datentypen. Grundlagen von JAVA Hello World in JAVA Elementare Datentypen

Funktionale versus objektorientierte Programmierung

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Programmieren I. Prinzipieller Ablauf. Eigenschaften von JAVA. Source-Code Javac Bytecode. Java Virtual Machine (Java, Browser, Appletviewer)

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

Info B VL 14: Java Collections/Reflections

Entwicklertreffen vom : Java Development Kit 8. Andri Feldmann, Lorenzo Pafumi, Linus Eberhard

Selbststudium OOP Programmieren 1 - H1103 Felix Rohrer

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

3. Übungsbesprechung Programmkonstruktion

Praktisches API-Design

Java Programmierung Aufbau

Codegeneratoren mit Xtend , A. Arnold

Java I Vorlesung Generics und Packages

Übungsaufgabe Transaktion als Middleware

Programmiermethodik 3. Klausur Lösung

Dezentrale Kontrolle: Aktive Objekte. Aktive Objekte Die Klasse AnimatorThread Aktivierung Objekte beobachten Die Java-Klasse Thread

Programmieren in Java

Programmieren in Java

ADT: Java Collections und ArrayList

Web-Techniken Einführung in JavaScript

Funktionales Programmieren mit objektorientierten Sprachen

Persistenz von Objekten relationale Datenbank Eigene Datenstruktur XML (JAXB) Proprietäre Dateiformate (Lochkarten)

Enhanced Collection API

Einstieg in die Informatik mit Java

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Trotz Java agil entwickeln. David Burkhart, Marc Philipp XP Days Germany 2014

Closures in Java. Michael Wiedeking. Java Forum Stuttgart Juli MATHEMA Software GmbH (

Schwerpunkte. 10. Felder (Arrays) Grundprinzip von Arrays. Klassifikation von Typen in Programmiersprachen

JavaFX8 - JumpStart - JUGCH. file:///d:/workspace/kurs-java8/doc/javafx-jumpstart.html#1 1/128

Programmierkurs Java

Java 8. Lambdas und Streams

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Datenstrukturen / Container in Java

Theorie zu Übung 8 Implementierung in Java

2 Eine einfache Programmiersprache

Java Einführung Collections

FAKULTÄT FÜR INFORMATIK

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Monaden in anderen Programmiersprachen

Java I Vorlesung Nebenläufigkeit

Alles außer Java! JVM-Sprachen sagen Happy Birthday

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

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Einführung in Javadoc

C++ vs. Java. Hello world! Java C++ class HelloWorld { static public void main(string args) { System.out.println("Hello World!

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Java 8. Programmiermethodik. Eva Zangerle Universität Innsbruck

Vorkurs Informatik WiSe 15/16

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Distributed Computing Group

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Objektorientierung II & die Java Klassenbibliothek. Kristian Bergmann und Arthur Lochstampfer

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

Einführung in die STL

Transkript:

Neuerungen in Java 8 Eric Giese adesso AG

Neuerungen in Java 8 Sprachänderungen Die Streams API Java Platform, 8th Edition Ein Blick unter die Haube Auswirkungen und Ausblick 20.03.2015 2 Neuerungen in Java 8

Java 8 - Die Sprache 20.03.2015 3 Neuerungen in Java 8

Klassische Java - Interfaces 20.03.2015 4 Neuerungen in Java 8

SAM (Single Abstract Method) Interfaces 20.03.2015 5 Neuerungen in Java 8

SAM s als anonyme Klassen Bei späterem Klick auf Button Dialogbox anzeigen EventHandler<E>{ void handle(e); } Button { void setonaction(eventhandler<actionevent>); } final Window win =... button.setonaction(new EventHandler<ActionEvent>() { public void handle(actionevent e) { showmessage(win, "Clicked: " + e.gettarget()); } }); 20.03.2015 6 Neuerungen in Java 8

SAM s durch Lambda Expressions Bei späterem Klick auf Button Dialogbox anzeigen EventHandler<E>{ void handle(e); } Button { void setonaction(eventhandler<actionevent>); } final Window win =... button.setonaction((actionevent e) -> { showmessage(win, "Clicked: " + e.gettarget()); }); 20.03.2015 7 Neuerungen in Java 8

SAM s durch Lambda Expressions (Inline) Bei späterem Klick auf Button Dialogbox anzeigen EventHandler<E>{ void handle(e); } Button { void setonaction(eventhandler<actionevent>); } Window win =... button.setonaction( e -> showmessage(win, "Clicked: " + e.gettarget()); DONE! 20.03.2015 8 Neuerungen in Java 8

Wofür kann man Lambdas einsetzen? Asynchrone Verarbeitung Runnable answer = () -> out.println("the Answer is 42"); new Thread(answer).start(); Lazyness logger.fine("expensive even if not logged:" + verybigmap); logger.fine(() -> "Cheap if not logged:" + verybigmap); Funktionale Transformation File dir =... File[] files = dir.listfiles(f -> f.isfile()); 20.03.2015 9 Neuerungen in Java 8

Schick: MethodReferences! Lambda-Expression dir.listfiles(f -> f.isfile()); Method Reference dir.listfiles(file::isfile); Kandidaten: String::isEmpty, Integer::toString, Objects::isNull,... 20.03.2015 10 Neuerungen in Java 8

Spaß mit Lambdas und Collections List<Customer> customers =... Kunden ohne Einkäufe entfernen customers.removeif(c -> c.getitems().isempty()); Rest per Name sortieren customers.sort(comparator.comparing(customer::getname)); und eine Rechnung senden! customers.foreach(c -> c.sendinvoice()); 20.03.2015 11 Neuerungen in Java 8

An die Java-Gurus: Woher kommen die neuen Interface-Methoden? customers.sort(comparator.comparing(customer::getname)); Neue Methode in List? Statische Methode in Comparator?? 20.03.2015 12 Neuerungen in Java 8

Interfaces: Default Methoden public interface List<E> { E get(int index); default void set(int index, E element){ } throw new UnsupportedOperationException(); default void sort(comparator<? super E> c) { } Collections.sort(this, c); 20.03.2015 13 Neuerungen in Java 8

Interfaces: Statische Methoden public interface Comparator<T> { int compare(t o1, T o2);... public static <T> Comparator<T> naturalorder() { return NaturalOrderComparator.INSTANCE; } public static <T, U> Comparator<T> comparing(function<t, U> fn){ return (c1, c2) -> fn.apply(c1).compareto(fn.apply(c2)); } Anmerkung: Die Generics wurden vereinfacht, der Code ist KEIN gültiges Java! 20.03.2015 14 Neuerungen in Java 8

Putting it together Kunden nach Namen sortieren. Bei Namensgleichheit werden sie absteigend nach Alter sortiert. import static Comparator.comparing; customerlist.sort( comparing(customer::getname).thencomparing( comparing(customer::getage).reversed())); static methods default methods 20.03.2015 15 Neuerungen in Java 8

DIE STREAM API 20.03.2015 16 Neuerungen in Java 8

Beispiel: Eine Kundendatenverarbeitung Customer name: String age: int sendinvoice() 1 n Item price: double Collection<Customer> customers =... 20.03.2015 17 Neuerungen in Java 8

Aufgabe: Für alle Kunden Rechnungen versenden! Externe Iteration for (Customer c : customers) { c.sendinvoice(); } Interne Iteration customers.foreach(customer::sendinvoice); //c -> c.sendinvoice() customers.iterator().foreachremaining(customer::sendinvoice); customers.parallelstream().foreach(customer::sendinvoice); // roll your own: <E> void foreach(consumer<e> c){... } 20.03.2015 18 Neuerungen in Java 8

Die Stream-API: Queries auf iterierbaren Datenstrukturen Allen volljährigen Kunden eine Rechnung schicken customers.stream().filter(c -> c.getage() >= 18) // Stream<Customer> // in: Predicate<Customer>.forEach(Customer::sendInvoice); // in: Consumer<Customer> Alle minderjährigen Kunden als Liste List<Customer> underage = customers.stream().filter(c -> c.getage() < 18).collect(Collectors.toList()); 20.03.2015 19 Neuerungen in Java 8

Die Stream-API: Queries auf iterierbaren Datenstrukturen Die Namen aller Kunden als Set Set<String> names = customers.stream().map(customer::getname).collect(collectors.toset()); // in: Function<Customer,String> // out: Stream<String> Dasselbe als sortierte Liste mit paralleler Verarbeitung List<String> names = customers.parallelstream().map(customer::getname).sorted().distinct().collect(collectors.tolist()); // Stream<String> 20.03.2015 20 Neuerungen in Java 8

Primitives Streaming Umsatz berechnen => Den Wert aller Kundenpositionen aufaddieren! double turnaround = customers.stream() //Stream<Customer>.flatMap(c -> c.getitems().stream()) //Stream<Item>.mapToDouble(Item::getPrice).sum(); //in: ToDoubleFunction<Item> //out: DoubleStream Geht mit int, long, double Primitive Operationen: average(), count(),... 20.03.2015 21 Neuerungen in Java 8

Woher kommen die Lambdas? Generische Basisformen Consumer: I -> void Function: I -> O Predicate: I -> boolean Supplier: () -> O Primitive Spezialisierungen int long double 20.03.2015 22 Neuerungen in Java 8

Neuerungen auf der Java Platform 20.03.2015 23 Neuerungen in Java 8

Nicht neu, aber ab 8 im JDK enthalten (mit eigenem launcher) Neues Client-GUI-Framework > JavaFX vs. Swing + AWT > CSS-Styling, XML-Layouting > Java, Javascript > more cool features 20.03.2015 24 Neuerungen in Java 8

Die neue Javascript Engine Nashorn Ersatz für das lahme Rhino Rocked-Powered by invokedynamic Calling from java ScriptEngineManager factory = ScriptEngineManager(); ScriptEngine engine = factory.getenginebyname("nashorn"); engine.eval("print('hello, World!');"); (JavaFx) GUI-Coding in JS var button = new Button(); button.text = "Say 'Hello World'"; button.onaction = function() print("hello World!"); 20.03.2015 25 Neuerungen in Java 8

Was gibt s sonst so Neues im JDK? JEP 150: Date & Time API > basiert auf joda-time (selber Author) > java.util.calendar ist Vergangenheit LocalDate date = LocalDate.of(2013, DECEMBER, 13); assertequals(december, date.getmonth()); ZonedDateTime time = ZonedDateTime.from(date.withYear(2012)); long millis = Instant.from(time).toEpochMilli(); String out = DateTimeFormatter.ISO_DATE.format(time); 20.03.2015 26 Neuerungen in Java 8

Was gibt s sonst so Neues im JDK? JEP 155: Concurrency Updates > ForkJoinPool improvements > ConcurrentHashMap mit map-reduce JEP 135: Base64 Encoding & Decoding > wow! Modellpflege: JDBC 4.2, Unicode 6.2, 20.03.2015 27 Neuerungen in Java 8

Memory-Tuning: Das RT und die JVM im Schlankheitswahn! Runtime Library JEP 147: Reduce Class Metadata Footprint JEP 149: Reduce Core-Library Memory Usage Virtual Machine JEP 148: Small VM (9 -> 3MB!) JEP 122: Remove the Permanent Generation JEP 178: Statically Linked Libraries 20.03.2015 28 Neuerungen in Java 8

Ongoing Roadwork: Modularisierung mit Jigsaw JEP 162: Prepare for Modularization JEP 161: Compact Profiles Profile Size (MB) libs 1 < 14 lang, util, (n)io, math, text, time, security-core 2 ~ 18 + rmi, xml, sql 3 ~ 21 + instrumentation, naming, script, xml-dsig full 45+++ + * (awt, swing, javafx, ) 20.03.2015 29 Neuerungen in Java 8

Ein Blick unter unter die Haube 20.03.2015 30 Neuerungen in Java 8

Lambdas sind keine inneren Klassen! class Hello { public String tostring() { return "Hello, world!"; } } Runnable r = () -> System.out.println(this); new Hello().r.run(); Ausgabe: "Hello, World!" Bei innerer Klasse: "Hello$Runnable$1@42" 20.03.2015 31 Neuerungen in Java 8

Lambdas in kompilierter Form class Hello { public String tostring() { return "Hello, world!"; } Runnable r = [invokedynamic: use lambda$1 as Block]; synthetic void lambda$1(){ System.out.println(this); } } Deklaration: invokedynamic-linking + Rezept Body: synthetische Methode (entfällt bei MethodReference) 20.03.2015 32 Neuerungen in Java 8

Backporting Lambdas? Retrolambda 1. Klassen mit javac 8 kompilieren 2. Durch Retrolambda parsen: Ruft die J8-Lambda-Factory auf um bytecode für Java 5, 6, 7 zu erzeugen Einschränkungen > Keine default oder static Methoden auf interfaces > Keine neuen Bibliotheken (Streams, functions) Als funktionale Library z.b. Guava: ImmutableSet<String> names = FluentIterable.from(customers).filter(c -> c.getage() > 18).transform(Customer::getName).toSortedSet(Ordering.natural()); 20.03.2015 33 Neuerungen in Java 8

Abbildung von Lambdas auf bisherigen Hotspot-VMs: void foreach(consumer<e> c){ for (E e : this) c.apply(e); } foreach ruft virtuelle Methode apply in Schleife auf customers.foreach ( c -> println(c)); apply ist monomorphic -> inlined customers.foreach ( c -> c.sendinvoice()); apply wird bimorphic -> inlined, conditional customers.foreach ( c -> println(c.getitems())); apply wird megamorphic -> not inlined, vtable dispatch 20.03.2015 34 Neuerungen in Java 8

Auswirkungen von Java 8 20.03.2015 35 Neuerungen in Java 8

Einsatzmöglichkeiten von Lambdas für Queries und Transaktionen (JDBC, JPA) für asychrone Callbacks (AJAX, JMS?) statt Strings für Bean Properties in anderen JVM-Sprachen (LambdaMetafactory, Stream-API) > javascript! > groovy? > Scala??? 20.03.2015 36 Neuerungen in Java 8

Wie wird sich die Java-Platform entwickeln? Compile Once, Run Everywhere revisited > Geschwindigkeitsoptimierte Maxi-VMs für Server > Speicheroptimierte Mini-VM s für Embebbed / Mobile Standardumgebung für neue funktionale und dynamische Sprachen Zurück auf die (embedded) Clients! > Gui-Entwicklung mit javafx und javascript? > Fat-Binaries mit eingebetteten VM s und statisch verlinkten nativen Libs 20.03.2015 37 Neuerungen in Java 8

Checkliste: Veraltete Java-Sprachkonstrukte Konstrukt Ersatz Arrays (außer primitive) Generischer Container (seit 1.5) Anonyme & Innere Klassen Abstrakte Klassen For-Schleife (1.5) Checked Exceptions null Lambda Expressions Interfaces mit Default Methoden foreach() Unchecked Exceptions Optional<T> 20.03.2015 38 Neuerungen in Java 8

So long Wenns später noch Fragen gibt: giese@adesso.de

Further Reading Tech Empower: Everything about Java 8 Maurice Naftalin's Lambda FAQ Brian Goetz: State Of The Lambda Brian Goetz: State Of The Lambda Libaries Edition Brian Goetz: Lambda Translation (2012) Brian Goetz: Implementing Lambda Expressions in Java 20.03.2015 40 adesso SummIT 2013