Optional
6. Optional: Lambdaausdrücke, Funktionales Interface, Iteration
Das Hintergrunddokument kann als Ausgangsbasis zur Erstellung eigenen Unterrichtsmaterials dienen. Eine Lektüre der Dokumentation des Pakets java.util.function ist auch denkbar.
Nach einer Einführung in den Zweck und die Notation von Lambdaausdrücke können folgende Aufgaben gestellt werden. Diese können alle in der Direkteingabe von BlueJ auf den Basisdaten ausgeführt werden.
Öffne in der Java-Dokumentation die Seite zu java.util.function. Betrachte parallel die Seiten zu java.util.Collection, java.lang.Iterable
-
Notiere die Signatur aller Methoden in Collection<E> und Iterable<E> die als Zieltyp eines ihrer Parameter ein funktionales Interface haben.
In Collection<E>: default boolean removeIf(Predicate<? Super E> filter>); default <T> T[] toArray(IntFunction<T[]> generator); In Iterable<E>: default void forEach(Consumer<? Super T> action);
-
Nutze die gefundenen Methoden, um mit Hilfe eines Lambdaausdrucks alle Filme mit einer Bewertung schlechter als 7.0 aus einer gegebenen Filmsammlung zu löschen. Gib eine Zeile Code an.
Tipp: Du kannst dies in BlueJ mit den Basisdaten kfG in der Direkteingabe testen.
kfG.removeIf(f -> (f.getBewertung()<7.0));
-
Schreibe eine Zeile Code, welche alle Titel einer Filmsammlung ausgibt. Nutze einen Lambdaausdruck.
Tipp: Denke daran, dass Collection<E> extends Iterable<E>
kfG.forEach(f -> System.out.print(f.getTitel()+", "));
-
Schreibe eine Zeile Code, welcher die Bewertung aller Filme einer Filmsammlung um 0.5 erhöht, aber nicht über 10.0 hinaus.
kfG.forEach(f -> {if(f.getBewertung()<=9.5) f.setBewertung(f.getBewertung()+0.5);});
-
Suche in der Dokumentation zu java.util.Collections nach einer Methode, mit der du den Film mit der schlechtesten Bewertung findest. Schreibe eine Zeile Code, die den Titel dieses Films ausgibt.
Tipp: Du benötigst auch einen Comparator<E>. Hierfür gibt es in java.util.Comparator eine statische Methode comparing(Function<? super T,? extends U> keyExtractor)
System.out.println("Schlechteste Bewertung: " + java.util.Collections.min(kfG, java.util.Comparator.comparing(f - > f.getBewertung() )).getTitel());
Die obigen Aufgaben sollen als Inspiration dienen selbst weitere Aufgaben nach folgendem Muster zu erstellen: „Suche in der Dokumentation einen passenden Typ und eine Methode, welche funktionale Interfaces unterstützt, und löse anschließend das Problem in einer Zeile Code.“
7. Optional zur Differenzierung: Streams, Filter-Map-Reduce-Muster
Die Schülerinnen und Schüler, die dann immer noch nicht genug haben, können sich mit Streams und dem Filter-Map-Reduce-Muster beschäftigen (siehe Hintergrunddokument).
Einzeiler-Aufgaben könnten lauten:
-
Bestimme den Filmtitel mi der schlechtesten Bewertung.
kfG.stream().reduce(kfG.get(0),
(min, t) -> (t.getBewertung() < min.getBewertung()) ? t : min)
.getTitel();
2. Bestimme die Anzahl aller Filme der Sammlung mit einer Bewertung besser als 7.0
kfG.stream().filter( f -> f.getBewertung()>7.0 )
.mapToInt(f -> 1).sum() );
8. Optional zur Differenzierung: generische Methoden
In der Dokumentation stoßen Schülerinnen und Schüler auch bereits auf Signaturen generisch deklarierter Methoden. Folgende Aufgaben machen die Notwendigkeit solcher Methoden deutlich.
-
Bereits Programmierauftrag „Aufgabe.a4“ im Code verdeutlicht die Notwendigkeit generischer Methoden. Löse den Auftrag generisch.
Lösungsordner. Musterlösung Aufgabe.a4_generic
-
Siehe Programmierauftrag „Aufgabe.a6“: im Code.
Siehe Lösungsordner
-
Vergleiche die Methoden aus Aufgabe.a6. Nenne Stellen, an denen sie sich unterscheiden.
Ohne Lösung
-
Aufgabe.a6 generisch lösen. Hinweis: Hier benötigen die SuS sicher noch weitere Hilfestellung, z.B. dass die Typen String, Integer und Float das Comparable Interface implementieren und damit die Methode compareTo(..) haben. Die Dokumentation hilft dann auch wieder weiter.
Siehe Lösung zu Aufgabe.a6
03_unterrichtsverlauf.odt: Herunterladen [odt][216 KB]
Weiter zu Vorlagen im Tauschordner