Code: https://github.com/andrena/java8-workshop
if (logger.isLoggable(Level.INFO)) {
logger.info(ermittleKomplizierteNachricht());
}
Im obigen Beispiel wird ermittleKomplizierteNachricht()
nur dann aufgerufen, wenn Level.INFO
geloggt werden soll. Wie kann man das gleiche erreichen, ohne ein if
-Statement zu verwenden?
Tipp: Schau dir die info
-Methoden der Klasse java.util.logging.Logger
an.
Schreibe eine Log-Methode, die wie folgt aufgerufen wird:
logIf(() -> x > 0, Level.INFO, () -> "X was > 0: " + x);
- Die Bedingung wird nur aufgerufen, wenn der LogLevel an ist
- Die Nachricht wird nur erstellt, wenn die Bedingung erfüllt ist
Schreibe eine statische Methode mit folgender Signatur, die den vom Supplier
gelieferten Wert an den Consumer
weitergibt und rufe sie auf.
<T> void consume(Supplier<T> supplier, Consumer<T> consumer)
Warum ist die oben genannte Signatur zu restriktiv? Was wäre besser?
Erzeuge eine Liste von Personen und gebe sie auf die Konsole aus ohne eine Schleife zu verwenden.
Implementiere eine statische Methode mit folgender Signatur, die alle Elemente aus einer Collection
entfernt, die einem Predicate
entsprechen, und rufe sie auf.
<T> void removeIf(Collection<T> collection, Predicate<T> predicate)
Tipp: Verwende Collection#iterator
.
Warum ist die oben genannte Signatur zu restriktiv? Was wäre besser?
Schreibe eine statische Methode mit folgender Signatur, die den vom Supplier
gelieferten Wert an den Consumer
weitergibt, wenn das Predicate
erfüllt ist, und rufe sie auf.
<T> void consumeIf(Supplier<T> supplier, Predicate<T> predicate, Consumer<T> consumer)
Implementiere eine statische Methode mit folgender Signatur, die alle Elemente, die einem Predicate
entsprechen, aus einer List
mit dem Wert ersetzt, den die Function
zurückgibt, und rufe sie auf.
<T> void replaceIf(List<T> list, Predicate<T> predicate, Function<T, T> function)
Tipp: Verwende List#listIterator
und ListIterator#set
.
Warum ist die oben genannte Signatur zu restriktiv? Was wäre besser?
Schreibe eine statische Methode mit folgender Signatur, die den vom Supplier
gelieferten Wert über die Function
an den Consumer
weitergibt, wenn das Predicate
erfüllt ist, und rufe sie auf.
<A,B> void convertAndConsumeIf(Supplier<A> supplier, Predicate<A> predicate, Function<A,B> function, Consumer<B> consumer)
Bearbeite die Klasse StreamAufgabe1
. Beginne jeweils mit einem Stream<Person>
, der über die Methode newPersonenStream()
erzeugt werden kann.
Jeder Test in der Klasse ist rot und soll durch Anwendung der richtigen Stream
-Methoden grün gemacht werden.
- Gibt es eine Person, die den Nachnamen "Maier" hat?
- Wie viele Personen gibt es mit Nachnahmen "Maier"?
- Bestimme die Anzahl verschiedener Vornamen (ohne Dubletten).
- Gibt es Personen mit Nachnahmen mit mehr als 8 Zeichen?
- Ermittle Statistiken über die Länge der Nachnamen (Minimum, Maximum, Durchschnitt).
Bearbeite die Klasse StreamAufgabe2
. Beginne jeweils mit einem Stream<Person>
, der über die Methode newPersonenStream()
erzeugt werden kann. (Tipp: vorgefertigte Collector
-Implementierungen: siehe java.util.stream.Collectors
)
- Erstelle eine sortierte Liste, die alle verschiedenen Vornamen der Personen mit Nachnamen "Maier" enthält.
- Genauso wie die vorherige Aufgabe, nur dass jetzt das Ergebnis eine
LinkedList
sein soll. - Erstelle einen
String
, der kommasepariert alle verschiedenen Vornamen der Personen mit Nachnamen "Maier" enthält. (z.B. "Egon, Hans, Walter") - Erstelle eine
Map
, die als Keys die Nachnamen enthält und als Value eine Liste mit den entsprechenden Personen:Map<String, List<Person>>
- Erstelle eine List mit einem String je Nachname der Form "Müller: Egon, Hans, Walter", d.h. jeder Nachname enthält einen Eintrag in der List und in dem String sind alle verschiedenen Vornamen sortiert und kommasepariert aufgelistet. (Tipp: Erstelle zunächste dieselbe Map, wie in der Aufgabe zuvor)
Bearbeite die Klasse OptionalAufgabe
ohne ein einziges if
-Statement zu verwenden.
- Finde die erste Person mit dem Nachnamen "Müller" in einem
Stream<Person>
. - Verwende einen Default-Wert für die Person, wenn keine gefunden wurde.
- Gib die Person aus, sofern sie gefunden wurde.
- Gib die Person aus, sofern sie gefunden wurde und den Vornamen "Daniel" hat.
- Lese den Nachnamen der Person aus, falls sie gefunden wurde. Ansonsten verwende "Maier" als Nachnamen.
- Erzeuge selbst ein befülltes
Optional<Person>
. - Erzeuge selbst ein leeres
Optional<Person>
. - Wirf eine
IllegalArgumentException
, wenn einOptional<Person>
leer ist.
Bearbeite die Klasse DateTimeAufgaben
.
- Ermittle die Anzahl der Personen, die an einem Freitag den 13. geboren sind.
- Ermittle den Wochentag des 1. April 2014.
- Ermittle das Alter in Jahren, Monaten und Tagen einer Person, die am 12. März 1976 geboren ist. Tipp: Verwende die Klasse
Period
. - Gib alle Zeitzonen sortiert aus. Siehe
ZoneId.getAvailableZoneIds
, verwende dieStream
-API. - Gruppiere die Personen nach Geburtsjahr und ermittle das Jahr mit den meisten Geburten.
(C) Copyright 2014 andrena objects ag