Java Academy · Lektion

flatMap til indlejrede samlinger

Fladgør indlejrede lister, Optional-kæder og fil-linjestrukturer med flatMap.

Lektion 1 af 413 trin

flatMap til indlejrede samlinger er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Problemet med indlejrede samlinger

Når hvert element i en strøm afbilder til en anden samling, giver map dig en Stream<List<T>>. flatMap sammenfletter de indre strømme til én flad Stream<T>.

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 kontra map

map(f) anvender f på hvert element og pakker resultatet ind. flatMap(f) anvender f, som returnerer en strøm, og sammenkæder derefter alle disse strømme til én.

// 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));

Fladgøring af ordrer og varer

Et klassisk eksempel: Hver ordre har en liste med varer. Hent en flad strøm med alle varer på tværs af alle ordrer.

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

flatMap med Optional

Brug stream() på Optional (Java 9+) til at konvertere den til en strøm med 0 eller 1 element. Derefter sammenfatter flatMap en Stream<Optional<T>> til Stream<T>.

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]

Læsning af alle linjer fra flere filer

flatMap gør det nemt at sammenkæde alle linjer fra en liste med filer til én strøm uden indlejrede løkker.

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());

Opdeling af strenge i ord

Opdel hver sætning i ord, og flad alle ordene ud i én strøm til optælling af ordfrekvenser.

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 med Map.entrySet

Flad et map over kategorier til lister med varer ud til en strøm med alle varerne.

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]

Undgå NullPointerException i flatMap

Hvis funktionen kan returnere null i stedet for en strøm, skal du kontrollere for null eller returnere Stream.empty() for at undgå NullPointerException.

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

Optælling af entydige ord med flatMap

Kombinér flatMap, distinct og count til kortfattet databehandling.

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 til primitive strømme

Brug flatMapToInt, flatMapToLong og flatMapToDouble for at undgå boxing, når du flader ud til primitive strømme.

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

Ydelsesbemærkning

Hvert kald af flatMap tilføjer et strømlag. Ved meget store datasæt med mange små indre samlinger kan du overveje iterative tilgange eller Spliterator for at reducere omkostningerne ved oprettelse af objekter.

Hurtigt tjek

Hvad gør flatMap anderledes end map?

Opsummering

flatMap konverterer hvert element til en strøm og sammenfletter alle strømme til én. Brug den til at flade indlejrede samlinger ud, kæde Optionals sammen, opdele strenge og læse flere filer. Brug flatMapToInt for at undgå boxing.

Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “flatMap til indlejrede samlinger” gratis?

Ja — hele teksten til “flatMap til indlejrede samlinger” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “flatMap til indlejrede samlinger”?

Fladgør indlejrede lister, Optional-kæder og fil-linjestrukturer med flatMap. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “flatMap til indlejrede samlinger”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. flatMap til indlejrede samlinger
  2. Parallelle streams: Ydeevne og faldgruber
  3. Spliterator: Opdeling til parallelisering
  4. Uendelige streams med iterate og generate
← Tilbage til Java Academy