Lambda Expressions in Java 8

Ähnliche Dokumente
Ich liebe Java && Ich liebe C# Rolf Borst

Beispiel: DB-Mock (1/7)

Grundlagen von Datenbanken SS 2010 Kapitel 8: Datenbank-Einbettung in Programmiersprachen Prof. Dr. Stefan Böttcher Universität Paderborn

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

Java 8. Die wichtigsten Neuerungen. W3L AG

Java-Schulung Grundlagen

Kapitel 10. JDBC und SQLJ. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

Java 8: Lambdas, Streams & Co

DB-Programmierung. Lehr- und Forschungseinheit Datenbanken und Informationssysteme 1. Ziele. DB2 Zugriff mit Java selbst programmieren

JDBC. Allgemeines ODBC. java.sql. Beispiele

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

JUGS Java 8 Hands On Übungen

13. Funktionale Konzepte in Java

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql

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

public class SternchenRechteckGefuellt {

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

Datenbank und Informationssysteme

Folgendes PL/SQL Codefragment zeigt das grundlegende Statement für diesen Test: Java.

Prof. Dr.-Ing. Wolfgang Lehner. Externe User Defined Functions und externe Stored Procedures

Client/Server-Programmierung

Große Übung Praktische Informatik 1

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Einstieg in die Informatik mit Java

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

Gebundene Typparameter

vs. Fehler zur Übersetzungszeit

Kapitel 7 des Buches, von Java-Selbstbau nach Scala-Library portiert Christoph Knabe

Bean-Mapping mit MapStruct

Wie kommen die Befehle zum DBMS

Programmiertechnik II Klausur WS 15/16 Angewandte Informatik Bachelor

Klausur Grundlagen der Programmierung

UNIVERSITÄT ULM Fakultät für Ingenieurswissenschaften und Informatik Institut für Datenbanken und Informationssysteme

Oracle: Abstrakte Datentypen:

Programmieren II. Beispiele für RDBMS. Relationale Datenbanken. Datenbanken SQL. Dr. Klaus Höppner JDBC. Hochschule Darmstadt SS 2008

Datum, Uhrzeit: , Uhr Matrikelnummer:... Semester: INbac2 Prüfer: Prof. Meixner Note:...

Anwendungsentwicklung für relationale Datenbanken setzt voraus, dass prozedurale Abläufe programmiert werden können!

Java 8 Lambdas und Streams

Java - Programmierung - Objektorientierte Programmierung 1

Objektorientierte Programmierung. Kapitel 12: Interfaces

Klausur: Java (Liste P)

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

LINQ. LANGUAGE INTEGREATED QUERY.net 3.5. Bernhard Grojer

Programmieren in Java

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Verteidigung gegen SQL Injection Attacks

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

Höhere Programmierkonzepte Testklausur

Richard Bubel & Martin Hentschel

Arten des universellen Polymorphismus

Übungsaufgabe Transaktion als Middleware

II.3.1 Rekursive Algorithmen - 1 -

Datenbankanwendungen (JDBC)

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

Einführung in die Programmierung Vorlesungsprüfung

Java Einführung Collections

Klausur zur Vorlesung Datenbanksysteme I

Vorlesung Informatik II

3. Datenbankzugriff (JDBC) Grundlagen der Programmierung II (Java)

Datenbankanwendungsprogrammierung Crashkurs Java

Schnittstellen, Stack und Queue

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio /9

JdbcTemplate

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

Allgemeine Informatik II SS :30-13:30 Uhr

Udo Matthias Munz. Datenbanken und SQL. mit. Einführung. Informationstechnik

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Algorithmen und Datenstrukturen

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

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

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Wie kommen die Befehle zum DBMS

11 Anwendungsprogrammierung

Praktikum Datenbanken und verteilte Systeme Sommersemester 2015

Javakurs zu Informatik I. Henning Heitkötter

Datenbanksysteme. Programmieren von Datenbankzugriffen mit JDBC. Burkhardt Renz. Fachbereich MNI Technische Hochschule Mittelhessen

Java-Programmierung. Remote Method Invocation - RMI

Variablen manipulieren per JDI

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

Kapitel DB:VI (Fortsetzung)

Datenbankzugriff mit JDBC

Objektorientierte Programmierung

Java 8. Lambdas und Streams

Transkript:

Sie sind da Lambda Expressions in Java 8 Rolf Borst

Lambda Expressions sind cool Aus dem Internet Stimmt das?

Das total uncoole Beispiel Person nachname : String vorname : String alter : int plz : String wohnort : String List<Person> personen Aufgabe Es sollen alle Personen über 30 Jahre ermittelt werden (Ü-30 Party). Später soll auch nach Wohnorten, Namen, gesucht werden können.

Wie machen wir das bisher? Möglichkeit: Design Patterns filtern(personen, new FilterAlter(30)) filtern(personen, new FilterName("Schuster")) filtern(personen, new FilterWohnort("Stuttgart"))

Design Pattern public interface Filter<T> { boolean isterfuellt(t e); public <T> List<T> filtern(list<t> liste, Filter<T> filter) { List<T> treffer = new ArrayList<T>(); for (T e : liste) { if (filter.isterfuellt(e)) { treffer.add(e); return treffer;

Anonymous Inner Classes List<Person> treffer = filtern(personen, new Filter<Person>() { @Override public boolean isterfuellt(person p) { return p.getalter() >= 30; );

Was wäre denn richtig cool? filtern(personen, p.getalter() >= 30);

Was wäre denn richtig cool? filtern(personen, p.getalter() >= 30); Lambda Expressions

Lambda Expressions public interface Filter<T> { List<Person> treffer = filtern(personen, new Filter<Person>() { @Override public boolean isterfuellt(person p) { return p.getalter() >= 30; );

Lambda Expressions public interface Filter<T> { List<Person> treffer = filtern(personen, new Filter<Person>() { @Override public boolean isterfuellt(person p) { return p.getalter() >= 30; ); filtern(personen, (Person p) -> { return p.getalter() >= 30; ); filtern(personen, p -> p.getalter() >= 30 );

Lambda Expressions Exceptions public void verarbeiten(list<person> personen, int alter) { treffer = filtern(personen, p -> p.getalter() >= alter); Funktionalität Erzeuger public <T> List<T> filtern(list<t> liste, Filter<T> filter) { List<T> treffer = new ArrayList<T>(); for (T e : liste) { if (filter.isterfuellt(e)) { treffer.add(e); Aufrufer return treffer;

Functional Interface filtern(personen, p -> p.getalter() >= 30 ); Methodensignatur: filtern(list<t> liste, Filter<T> filter) { @FunctionalInterface public interface Filter<T> { boolean isterfuellt(t e); Interface mit genau einer abstrakten Methode Functional Interface default boolean nichterfuellt(t e) { return!isterfuellt(e); Interface darf default-methoden besitzen

Lambda Expressions (Person p1, Person p2) -> (p1, p2) -> (Typ ermittelbar) p -> (Nur ein Argument) () -> (Kein Argument) Linke Seite filtern(personen, p -> p.getalter() >= 30 );

Lambda Expressions filtern(personen, p -> p.getalter() >= 30 ); Rechte Seite -> (Ein Statement) -> { int min= 30; return p.getalter() >= min; p.getalter() >= 30

Auf was kann ich eigentlich in der Lambda Expression zugreifen? public class DatenService { Auf alles private int minalter; public void verarbeiten(list<person> personen, int altervon) { int alter = einlesenaltervongui(); List<Person> treffer = filtern(personen, p -> p.getalter() >= alter); public int ermittelnmindestalter() { return ;

public class DatenService { private int minalter; mit Einschränkungen Müssen final oder effektiv final sein public void verarbeiten(list<person> personen, int altervon) { int alter = einlesenaltervongui(); List<Person> treffer = filtern(personen, p -> p.getalter() >= alter); public int ermittelnmindestalter() { return ;

Das geht nicht for (int alter = 20; alter <= 70; alter++) { List<Person> treffer = filtern(personen, p -> p.getalter() == alter ); anzeigentreffer(treffer);

Das geht nicht for (int alter = 20; alter <= 70; alter++) { List<Person> treffer = filtern(personen, p -> p.getalter() == alter ); anzeigentreffer(treffer); das dagegen schon for (int alter = 20; alter <= 70; alter++) { int suchalter = alter; List<Person> treffer = filtern(personen, p -> p.getalter() == suchalter ); anzeigentreffer(treffer);

Exceptions public int berechnenalter(person p) throws AlterException { public void verarbeiten(list<person> personen) throws AlterException { treffer = filtern(personen, p -> berechnenalter(p) >= 30); Das geht nicht

Exceptions public int berechnenalter(person p) throws AlterException { public void verarbeiten(list<person> personen) throws AlterException { treffer = filtern(personen, p -> berechnenalter(p) >= 30); Das geht nicht Interface definiert Vertrag public interface Filter<T> { boolean isterfuellt(t e);

Exceptions public int berechnenalter(person p) throws AlterException { public void verarbeiten(list<person> personen) { treffer = filtern(personen, p -> { try { berechnenalter(p) >= 30); catch (AlterException) { return false; Eine mögliche Lösung

Lambda Expressions Exceptions Funktionalität public void verarbeiten(list<person> personen, int alter) { treffer = filtern(personen, p -> p.getalter() >= alter); Erzeuger public <T> List<T> filtern(list<t> liste, Filter<T> filter) { List<T> treffer = new ArrayList<T>(); for (T e : liste) { if (filter.isterfuellt(e)) { treffer.add(e); Aufrufer return treffer;

Design Pattern 1 Unser Filter-Interface public interface Filter<T> { boolean isterfuellt(t e); 2 Unsere filtern-methode public List<Person> filtern( ) { 3 Unsere Filter-Klassen AlterFilter, WohnortFilter, NameFilter, Anonymous Inner Classes Lambda Expressions

Design Pattern 1 Unser Filter-Interface gibt es schon 2 public interface Filter<T> { boolean isterfuellt(t e); Unsere filtern-methode public interface Predicate<T> { boolean test(t e); Package java.util.function Function, Consumer, Supplier, public List<Person> filtern( ) { 3 Unsere Filter-Klassen AlterFilter, WohnortFilter, NameFilter, Anonymous Inner Classes

Design Pattern 1 Unser Filter-Interface public interface Filter<T> { boolean isterfuellt(t e); 2 Unsere filtern-methode public List<Person> filtern( ) { gibt es schon Erweiterungen bei den Collections Streams 3 Unsere Filter-Klassen AlterFilter, WohnortFilter, NameFilter, Anonymous Inner Classes

Streams 0..n Intermediate Operations Eintrittskarte List<Person> personen = ; List<Person> treffer = personen.stream().filter(p -> p.getalter() >= 30).collect(Collectors.toList()); Stream<Person> Stream<Person> List<Person> Terminal Operation

Streams 0..n Intermediate Operations filter map distinct sorted limit skip List<Person> personen = ; List<Person> treffer = personen.stream().filter(p -> p.getalter() >= 30).collect(Collectors.toList()); Terminal Operation foreach reduce min max count findfirst anymatch allmatch collect tolist groupingby joining

Streams Aufgabe Es soll eine Namensliste der Personen über 30 Jahre erstellt werden. Die Liste soll nach dem Alter sortiert sein. List<Person> personen = ; List<String> nachnamen = personen.stream().filter(p -> p.getalter() >= 30).sorted(Comparator.comparingInt(Person::getAlter)).map(Person::getNachname).collect(Collectors.toList());

Methodenreferenzen Aufgabe Es soll eine Namensliste der Personen über 30 Jahre erstellt werden. Die Liste soll nach dem Alter sortiert sein. List<Person> personen = ; List<String> nachnamen = personen.stream().filter(p -> p.getalter() >= 30).sorted(Comparator.comparingInt(Person::getAlter)).map(Person::getNachname).collect(Collectors.toList()); Methodenreferenzen

Methodenreferenzen public interface Suche { boolean pruefen(person p, String begriff); public class PersonHelper { public static boolean ueberpruefen(person p, String begriff) { suchen( personen, PersonHelper::ueberpruefen ) Alternative für: suchen( personen, (p, b) -> PersonHelper.ueberpruefen(p, b) )

Methodenreferenzen public interface Suche { boolean pruefen(person p, String begriff); public class PersonPruefer { public boolean ueberpruefen(person p, String begriff) { PersonPruefer pruefer = new PersonPruefer(); suchen( personen, pruefer::ueberpruefen ) Alternative für: suchen( personen, (p, b) -> pruefer.ueberpruefen(p, b) )

Methodenreferenzen public interface Suche { boolean pruefen(person p, String begriff); public class Person { public boolean ueberpruefen(string begriff) { suchen( personen, Person::ueberpruefen ) Alternative für: suchen( personen, (p, b) -> p.ueberpruefen(b) )

Methodenreferenzen public interface Erzeuger { Person erzeugen(string nachname, String vorname); public class Person { public Person (String nachname, String vorname) { erweitern( personen, Person::new ) Alternative für: erweitern( personen, (n, v) -> new Person(n, v) )

Methodenreferenzen List<Person> personen = ; p -> p.getalter() List<String> nachnamen = personen.stream().filter(p -> p.getalter() >= 30).sorted(Comparator.comparingInt(Person::getAlter)).map(Person::getNachname).collect(Collectors.toList()); p -> p.getnachname()

Mehr Beispiele

1 Oberflächen bisher Button speichernbutton = new Button("Speichern"); speichernbutton.setonaction(new EventHandler<ActionEvent>() { @Override public void handle(actionevent event) { speichern(); );

1 Oberflächen mit Lambda Expressions Button speichernbutton = new Button("Speichern"); speichernbutton.setonaction(e -> speichern()); oder Button speichernbutton = new Button("Speichern"); speichernbutton.setonaction(this::speichern);

2 Logging bisher logger.debug( ermittelndebuginfo() ); private String ermittelndebuginfo() { // dauert sehr lange

2 Logging bisher besser if (logger.isdebugenabled()) { logger.debug( ermittelndebuginfo() ); private String ermittelndebuginfo() { // dauert sehr lange

2 Logging mit Lambda Expressions logger.debug( () -> ermittelndebuginfo() ); oder logger.debug( this::ermittelndebuginfo ); Im Logging-Framework: public void debug(messagesupplier message) if (isdebugenabled()) { writelog( message.get() ); ermittelndebuginfo()

3 JDBC bisher try (Connection conn = getconnection()) { String sql = "SELECT artikelnr, bezeichnung FROM artikel WHERE gruppe =?"; try (PreparedStatement stmt = conn.preparestatement(sql)) { stmt.setstring(1, gruppe); ResultSet rs = stmt.executequery(); while (rs.next()) { Artikel artikel = new Artikel(); artikel.setartikelnr(rs.getint("artikelnr")); artikel.setbezeichnung(rs.getstring("bezeichnung")); artikelliste.add(artikel); rs.close();

3 JDBC mit Lambda Expressions besser? List<Person> personen = datenermitteln( () -> getconnection(), () -> "SELECT artikelnr, bezeichnung FROM artikel WHERE gruppe =?", stmt -> stmt.setstring(1, gruppe), rs -> { Artikel artikel = new Artikel(); artikel.setartikelnr(rs.getint("artikelnr")); artikel.setbezeichnung(rs.getstring("bezeichnung")); return artikel; );

Fazit Lambda Expression sind cool

Sie sind da Lambda Expressions in Java 8 Danke