flatMap for nestede samlinger
Flat ut nestede lister, Optional-kjeder og fil-linjestrukturer ved hjelp av flatMap.
flatMap for nestede samlinger er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Problemet med nestede samlinger
Når hvert element i en strøm avbilder til en annen samling, gir map deg en Stream<List<T>>. flatMap slår sammen de indre strømmene til én flat 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 5flatMap kontra map
map(f) bruker f på hvert element og pakker inn resultatet. flatMap(f) bruker f, som returnerer en strøm, og setter deretter alle disse strømmene sammen 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));Flate ut ordre og varer
Et klassisk bruksområde: Hver ordre har en liste over varer. Hent en flat strøm med alle varene fra alle ordrene.
List<String> allItems = orders.stream()
.flatMap(order -> order.getItems().stream())
.collect(Collectors.toList());
System.out.println(allItems);flatMap med Optional
Bruk stream() på Optional (Java 9+) for å konvertere den til en strøm med 0 eller 1 element. Deretter slår flatMap en Stream<Optional<T>> sammen 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]Lese alle linjer fra flere filer
flatMap gjør det enkelt å sette sammen alle linjene fra en liste med filer til én strøm, uten nestede 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());Dele strenger i ord
Del hver setning i ord, og flat ut alle ordene til én strøm for å telle 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
Flat ut et kart fra kategorier til lister med elementer til en strøm med alle elementene.
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]Unngå NullPointerException i flatMap
Hvis funksjonen kan returnere null i stedet for en strøm, bør du kontrollere om verdien er null, eller returnere Stream.empty() for å unngå NullPointerException.
departments.stream()
.flatMap(dept -> dept.getEmployees() == null
? Stream.empty()
: dept.getEmployees().stream())
.forEach(System.out::println);Telle unike ord med flatMap
Kombiner flatMap, distinct og count for 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 for primitive strømmer
Bruk flatMapToInt, flatMapToLong og flatMapToDouble for å unngå boxing når du flater ut til primitive strømmer.
int totalQuantity = orders.stream()
.flatMapToInt(order -> order.getItems().stream().mapToInt(Item::getQuantity))
.sum();
System.out.println("Total qty: " + totalQuantity);Ytelsesmerknad
Hvert kall på flatMap legger til et strømlag. For svært store datasett med mange små indre samlinger bør du vurdere iterative tilnærminger eller Spliterator for å redusere overhead fra objektoppretting.
Kort kontroll
Hva gjør flatMap annerledes enn map?
Oppsummering
flatMap konverterer hvert element til en strøm og slår alle strømmene sammen til én. Bruk den til å flate ut nestede samlinger, kjede sammen Optionals, dele strenger og lese flere filer. Bruk flatMapToInt for å unngå boxing.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «flatMap for nestede samlinger» gratis?
Ja – hele teksten i «flatMap for nestede samlinger» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «flatMap for nestede samlinger»?
Flat ut nestede lister, Optional-kjeder og fil-linjestrukturer ved hjelp av flatMap. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «flatMap for nestede samlinger»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- flatMap for nestede samlinger
- Parallelle strømmer: ytelse og fallgruver
- Spliterator: oppdeling for parallellitet
- Uendelige strømmer med iterate og generate