Sisäkkäisten Rakenteiden Käsittely FlatMap()-Menetelmällä
Työskenneltäessä tietokokoelmien kanssa Javassa kohdataan usein tilanteita, joissa rakenteet ovat sisäkkäisiä. Esimerkiksi käytössä voi olla lista olioista, joista jokainen sisältää toisen listan olioita.
Tällaisissa tapauksissa tavalliset operaatiot, kuten map(), eivät sovellu kaikkien sisäkkäisten tietojen poimimiseen yhteen streamiin. Tässä kohtaa Stream API:n flatMap()-metodi tulee käyttöön.
flatMap()-metodi ottaa funktion, joka muuntaa jokaisen streamin alkion uudeksi streamiksi.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— tuloksena olevan virran alkioiden tyyppi;Function<? super T, ? extends Stream<? extends R>> mapper— funktio, joka ottaa alkuperäisestä virrasta alkion (T) ja palauttaa tuloksena olevien alkioiden virran (Stream<R>).
On tärkeää ymmärtää, että flatMap() ei yksinkertaisesti palauta uutta alkiota, vaan jokaiselle alkiolle palautetaan virta (tai muu kokoelma). Nämä yksittäiset virrat yhdistetään lopuksi yhdeksi.
Käytännön sovellus
Kuvittele, että sinulla on useita tehtaita, joista jokainen valmistaa erilaisia tuotteita. Tavoitteena on luoda yhtenäinen lista kaikista näiden tehtaiden tuotteista ja muuntaa niiden nimet isoiksi kirjaimiksi.
Main.java
123456789101112131415161718192021222324252627282930313233343536package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Factory> factories = Arrays.asList( new Factory("SteelWorks", Arrays.asList("Drill", "Excavator", "Bulldozer")), new Factory("AutoParts", Arrays.asList("Carburetor", "Piston", "Transmission")), new Factory("ToolMakers", Arrays.asList("Screwdriver", "Wrench", "Hammer")) ); List<String> productList = factories.stream() .flatMap(factory -> factory.getProducts().stream()) // Flatten all product lists into a single stream .map(String::toUpperCase) // Convert product names to uppercase .toList(); // Collect results into a list System.out.println(productList); } } class Factory { private String name; private List<String> products; public Factory(String name, List<String> products) { this.name = name; this.products = products; } public List<String> getProducts() { return products; } }
factories-lista sisältää useita Factory-olioita, joista jokaisella on name ja lista products-tuotteita. Koska getProducts() palauttaa listan, stream()-kutsun käyttäminen factories-listaan tuottaa normaalisti streamin Factory-olioista, mikä ei ole haluttu lopputulos.
Varsinaisten tuotenimien poimimiseen käytetään flatMap(factory -> factory.getProducts().stream()). Tämä yhdistää kaikki tuotelistat yhdeksi jatkuvaksi streamiksi String-arvoja.
Tämän jälkeen map(String::toUpperCase) soveltaa toUpperCase()-metodia jokaiseen tuotenimeen, varmistaen että kaikki nimet ovat isolla kirjoitettuja ennen kuin ne kerätään productList-listaan toList()-metodilla.
Kokoelmien yhdistäminen yhdeksi
Kun data on järjestetty sisäkkäisiin kokoelmiin, flatMap()-metodi auttaa yhdistämään ne yhdeksi streamiksi, mikä helpottaa jatko-käsittelyä. Esimerkiksi voit yhdistää taulukon, joka sisältää muita taulukoita, yhdeksi taulukoksi.
Esimerkki
Sinulla on useita tuotantolinjoja, joista jokainen valmistaa useita tuotteita. Tavoitteena on saada yksi lista kaikista tuotteista, joita näillä linjoilla on valmistettu.
Main.java
12345678910111213141516171819202122package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // List of production lines with their products List<List<String>> productionLines = Arrays.asList( Arrays.asList("Tire", "Rim", "Shock Absorber"), Arrays.asList("Frame", "Tread", "Ball Joint"), Arrays.asList("Brakes", "Steering System") ); // Get a single list of all products manufactured in the factory List<String> allProducts = productionLines.stream() .flatMap(line -> line.stream()) // Convert each production line's product list into a stream .toList(); // Collect all products into a single list System.out.println(allProducts); } }
Tämä koodi käyttää flatMap()-metodia yhdistääkseen eri tuotantolinjojen sisäkkäiset tuotelistat yhdeksi yhtenäiseksi virraksi.
Jokainen tuotantolinja, joka on esitetty tuotelistana, muunnetaan alkioiden virraksi, joka lopuksi kerätään lopulliseen listaan käyttäen toList(). Lopputuloksena saat yhden listan, joka sisältää kaikki tehtaassa valmistetut tuotteet.
1. Mitä flatMap()-metodi tekee Stream API:ssa?
2. Mitä tapahtuu, kun käytetään flatMap()-metodia sisäkkäisten kokoelmien kanssa?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 2.33
Sisäkkäisten Rakenteiden Käsittely FlatMap()-Menetelmällä
Pyyhkäise näyttääksesi valikon
Työskenneltäessä tietokokoelmien kanssa Javassa kohdataan usein tilanteita, joissa rakenteet ovat sisäkkäisiä. Esimerkiksi käytössä voi olla lista olioista, joista jokainen sisältää toisen listan olioita.
Tällaisissa tapauksissa tavalliset operaatiot, kuten map(), eivät sovellu kaikkien sisäkkäisten tietojen poimimiseen yhteen streamiin. Tässä kohtaa Stream API:n flatMap()-metodi tulee käyttöön.
flatMap()-metodi ottaa funktion, joka muuntaa jokaisen streamin alkion uudeksi streamiksi.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— tuloksena olevan virran alkioiden tyyppi;Function<? super T, ? extends Stream<? extends R>> mapper— funktio, joka ottaa alkuperäisestä virrasta alkion (T) ja palauttaa tuloksena olevien alkioiden virran (Stream<R>).
On tärkeää ymmärtää, että flatMap() ei yksinkertaisesti palauta uutta alkiota, vaan jokaiselle alkiolle palautetaan virta (tai muu kokoelma). Nämä yksittäiset virrat yhdistetään lopuksi yhdeksi.
Käytännön sovellus
Kuvittele, että sinulla on useita tehtaita, joista jokainen valmistaa erilaisia tuotteita. Tavoitteena on luoda yhtenäinen lista kaikista näiden tehtaiden tuotteista ja muuntaa niiden nimet isoiksi kirjaimiksi.
Main.java
123456789101112131415161718192021222324252627282930313233343536package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Factory> factories = Arrays.asList( new Factory("SteelWorks", Arrays.asList("Drill", "Excavator", "Bulldozer")), new Factory("AutoParts", Arrays.asList("Carburetor", "Piston", "Transmission")), new Factory("ToolMakers", Arrays.asList("Screwdriver", "Wrench", "Hammer")) ); List<String> productList = factories.stream() .flatMap(factory -> factory.getProducts().stream()) // Flatten all product lists into a single stream .map(String::toUpperCase) // Convert product names to uppercase .toList(); // Collect results into a list System.out.println(productList); } } class Factory { private String name; private List<String> products; public Factory(String name, List<String> products) { this.name = name; this.products = products; } public List<String> getProducts() { return products; } }
factories-lista sisältää useita Factory-olioita, joista jokaisella on name ja lista products-tuotteita. Koska getProducts() palauttaa listan, stream()-kutsun käyttäminen factories-listaan tuottaa normaalisti streamin Factory-olioista, mikä ei ole haluttu lopputulos.
Varsinaisten tuotenimien poimimiseen käytetään flatMap(factory -> factory.getProducts().stream()). Tämä yhdistää kaikki tuotelistat yhdeksi jatkuvaksi streamiksi String-arvoja.
Tämän jälkeen map(String::toUpperCase) soveltaa toUpperCase()-metodia jokaiseen tuotenimeen, varmistaen että kaikki nimet ovat isolla kirjoitettuja ennen kuin ne kerätään productList-listaan toList()-metodilla.
Kokoelmien yhdistäminen yhdeksi
Kun data on järjestetty sisäkkäisiin kokoelmiin, flatMap()-metodi auttaa yhdistämään ne yhdeksi streamiksi, mikä helpottaa jatko-käsittelyä. Esimerkiksi voit yhdistää taulukon, joka sisältää muita taulukoita, yhdeksi taulukoksi.
Esimerkki
Sinulla on useita tuotantolinjoja, joista jokainen valmistaa useita tuotteita. Tavoitteena on saada yksi lista kaikista tuotteista, joita näillä linjoilla on valmistettu.
Main.java
12345678910111213141516171819202122package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // List of production lines with their products List<List<String>> productionLines = Arrays.asList( Arrays.asList("Tire", "Rim", "Shock Absorber"), Arrays.asList("Frame", "Tread", "Ball Joint"), Arrays.asList("Brakes", "Steering System") ); // Get a single list of all products manufactured in the factory List<String> allProducts = productionLines.stream() .flatMap(line -> line.stream()) // Convert each production line's product list into a stream .toList(); // Collect all products into a single list System.out.println(allProducts); } }
Tämä koodi käyttää flatMap()-metodia yhdistääkseen eri tuotantolinjojen sisäkkäiset tuotelistat yhdeksi yhtenäiseksi virraksi.
Jokainen tuotantolinja, joka on esitetty tuotelistana, muunnetaan alkioiden virraksi, joka lopuksi kerätään lopulliseen listaan käyttäen toList(). Lopputuloksena saat yhden listan, joka sisältää kaikki tehtaassa valmistetut tuotteet.
1. Mitä flatMap()-metodi tekee Stream API:ssa?
2. Mitä tapahtuu, kun käytetään flatMap()-metodia sisäkkäisten kokoelmien kanssa?
Kiitos palautteestasi!