0Pricing
Java Academy · Lektion

flatMap für verschachtelte Collections

Reduzieren Sie verschachtelte Listen, Optional-Ketten und Dateizeilenstrukturen mit flatMap auf eine Ebene.

flatMap für verschachtelte Collections ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Das Problem verschachtelter Collections

Wenn jedes Element eines Streams auf eine weitere Collection abgebildet wird, liefert map einen Stream<List<T>>. flatMap führt die inneren Streams zu einem einzigen flachen Stream<T> zusammen.

List<List<Integer>> nested = List.of(List.of(1,2), List.of(3,4), List.of(5));
// With map:
Stream<List<Integer>> s = nested.stream().map(l -> l); // Stream<List<Integer>>
// With flatMap:
Stream<Integer> flat = nested.stream().flatMap(List::stream); // Stream<Integer>
flat.forEach(System.out::println); // 1 2 3 4 5

flatMap vs. map

map(f) wendet f auf jedes Element an und verpackt das Ergebnis. flatMap(f) wendet f an, das einen Stream zurückgibt, und verkettet anschließend alle diese Streams zu einem einzigen.

// map: List<String> -> Stream<Stream<Character>>
Stream<Stream<Character>> nested = List.of("hi","bye").stream()
    .map(s -> s.chars().mapToObj(c -> (char)c));
// flatMap: List<String> -> Stream<Character>
Stream<Character> flat = List.of("hi","bye").stream()
    .flatMap(s -> s.chars().mapToObj(c -> (char)c));

Bestellungen und Artikel abflachen

Ein klassischer Anwendungsfall: Jede Bestellung enthält eine Liste von Artikeln. Erzeugen Sie einen flachen Stream mit allen Artikeln aus allen Bestellungen.

List<String> allItems = orders.stream()
    .flatMap(order -> order.getItems().stream())
    .collect(Collectors.toList());
System.out.println(allItems);

flatMap mit Optional

Verwenden Sie stream() für Optional (Java 9+), um es in einen Stream mit 0 oder 1 Elementen umzuwandeln. Anschließend führt flatMap einen Stream<Optional<T>> zu einem Stream<T> zusammen.

List<Optional<String>> maybes = List.of(Optional.of("a"), Optional.empty(), Optional.of("c"));
List<String> values = maybes.stream()
    .flatMap(Optional::stream)  // Java 9+
    .collect(Collectors.toList());
System.out.println(values); // [a, c]

Alle Zeilen aus mehreren Dateien lesen

Mit flatMap können Sie alle Zeilen aus einer Liste von Dateien einfach zu einem einzigen Stream verketten, ohne verschachtelte Schleifen zu verwenden.

List<Path> files = List.of(Path.of("a.txt"), Path.of("b.txt"));
List<String> allLines = files.stream()
    .flatMap(p -> {
        try { return Files.lines(p); }
        catch (IOException e) { return Stream.empty(); }
    })
    .collect(Collectors.toList());

Strings in Wörter aufteilen

Teilen Sie jeden Satz in Wörter auf und führen Sie alle Wörter zu einem einzigen Stream zusammen, um die Worthäufigkeit zu zählen.

List<String> sentences = List.of("hello world", "java streams rock");
Map<String, Long> freq = sentences.stream()
    .flatMap(s -> Arrays.stream(s.split("\\s+")))
    .collect(Collectors.groupingBy(w -> w, Collectors.counting()));
System.out.println(freq);

flatMap mit Map.entrySet

Führen Sie eine Map aus Kategorien und Artikellisten zu einem Stream mit allen Artikeln zusammen.

Map<String, List<String>> catalog = Map.of(
    "fruit", List.of("apple","banana"),
    "veg",   List.of("carrot","pea"));
List<String> all = catalog.values().stream()
    .flatMap(List::stream)
    .sorted()
    .collect(Collectors.toList());
System.out.println(all); // [apple, banana, carrot, pea]

NullPointerException in flatMap vermeiden

Wenn die Funktion möglicherweise null statt eines Streams zurückgibt, sichern Sie dies mit einer Nullprüfung ab oder geben Sie Stream.empty() zurück, um NullPointerException zu vermeiden.

departments.stream()
    .flatMap(dept -> dept.getEmployees() == null
        ? Stream.empty()
        : dept.getEmployees().stream())
    .forEach(System.out::println);

Verschiedene Wörter mit flatMap zählen

Kombinieren Sie flatMap, distinct und count für eine kompakte Datenverarbeitung.

long distinctWords = sentences.stream()
    .flatMap(s -> Arrays.stream(s.toLowerCase().split("[^a-z]+")))
    .filter(w -> !w.isEmpty())
    .distinct()
    .count();
System.out.println("Distinct: " + distinctWords);

flatMapToInt für primitive Streams

Verwenden Sie flatMapToInt, flatMapToLong und flatMapToDouble, um beim Abflachen zu primitiven Streams Boxing zu vermeiden.

int totalQuantity = orders.stream()
    .flatMapToInt(order -> order.getItems().stream().mapToInt(Item::getQuantity))
    .sum();
System.out.println("Total qty: " + totalQuantity);

Hinweis zur Performance

Jeder Aufruf von flatMap fügt eine Stream-Ebene hinzu. Bei sehr großen Datenmengen mit vielen kleinen inneren Collections sollten Sie iterative Ansätze oder Spliterator in Betracht ziehen, um den Overhead durch die Objekterzeugung zu verringern.

Schnelltest

Was macht flatMap anders als map?

Zusammenfassung

flatMap wandelt jedes Element in einen Stream um und führt alle Streams zu einem einzigen zusammen. Verwenden Sie es, um verschachtelte Collections abzuflachen, Optionals zu verketten, Strings aufzuteilen und mehrere Dateien zu lesen. Verwenden Sie flatMapToInt, um Boxing zu vermeiden.

Häufig gestellte Fragen

Ist die Lektion „flatMap für verschachtelte Collections“ kostenlos?

Ja — der vollständige Text von „flatMap für verschachtelte Collections“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „flatMap für verschachtelte Collections“?

Reduzieren Sie verschachtelte Listen, Optional-Ketten und Dateizeilenstrukturen mit flatMap auf eine Ebene. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „flatMap für verschachtelte Collections“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. flatMap für verschachtelte Collections
  2. Parallele Streams: Leistung und Fallstricke
  3. Spliterator: Aufteilen für Parallelität
  4. Unendliche Streams mit iterate und generate
← Zurück zu Java Academy