Lektionen des Moduls (2/2)
Stream API
Die Stream API in Java ermöglicht die deklarative Verarbeitung von Objektsammlungen unter Nutzung funktionaler Programmierung. Ein Stream speichert keine Daten, sondern transportiert die Elemente aus einer Quelle (wie einer Liste oder einem Array) durch eine Pipeline von Operationen.
Eine Stream-Pipeline besteht aus drei Teilen:
- Einer Quelle (z. B.
list.stream()) - Null oder mehr Zwischenoperationen (die einen neuen Stream zurückgeben, z. B.
filter,map) - Einer Terminaloperation (die ein Endergebnis oder einen Seiteneffekt erzeugt und den Stream schließt, z. B.
collect,forEach,reduce)
Häufige Zwischenoperationen
Zwischenoperationen sind "lazy" (träge): Sie werden erst ausgeführt, wenn eine Terminaloperation aufgerufen wird.
filter(Predicate): Filtert Elemente basierend auf einer booleschen Bedingung.map(Function): Transformiert jedes Element durch Anwendung einer Funktion in ein anderes Objekt.sorted(): Sortiert die Elemente des Streams.
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"
Häufige Terminaloperationen
forEach(Consumer): Führt eine Aktion für jedes Element des Streams aus.collect(Collector): Sammelt die Ergebnisse des Streams in einem Container (z. B. eine Liste mittelsCollectors.toList()).reduce(identity, BinaryOperator): Kombiniert die Elemente des Streams zu einem einzigen kumulativen Wert.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Somma tutti i numeri: 10
Probiere es aus
Vervollständigen Sie den Code, indem Sie den Ressourcen-Stream verwenden, um nur gerade Zahlen zu filtern, diese in einer neuen List namens evens zu sammeln und sie mit System.out.println auszugeben.
Hinweis anzeigen
Beginnen Sie mit dem Aufruf von `numbers.stream()`, fügen Sie `.filter(n -> n % 2 == 0)` hinzu und sammeln Sie schließlich mit `.collect(Collectors.toList())`.
Lösung nach 3 Versuchen verfügbar
Verwenden Sie Streams, um alle Namen in der Liste names mittels map in Großbuchstaben umzuwandeln, und geben Sie sie einzeln mit forEach unter Verwendung von System.lineSeparator oder einer Methodenreferenz aus.
Hinweis anzeigen
Verwenden Sie `.map(s -> s.toUpperCase())`, gefolgt von der Terminaloperation `.forEach(System.out::println)`.
Lösung nach 3 Versuchen verfügbar
Vervollständigen Sie den Code, indem Sie die Summe aller Zahlen in der Liste numbers mithilfe eines Streams und der Terminaloperation reduce mit dem Startwert 0 berechnen. Geben Sie das Ergebnis aus.
Hinweis anzeigen
Verwenden Sie `numbers.stream().reduce(0, (a, b) -> a + b)` und geben Sie die Variable aus, die das Ergebnis enthält.
Lösung nach 3 Versuchen verfügbar