Työskentely Sisäkkäisten Rakenteiden Kanssa 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 yhdellä streamilla. Tähän tarkoitukseen on olemassa Stream API:n flatMap()-metodi.
flatMap()-metodi ottaa funktion, joka muuntaa jokaisen streamin alkion uudeksi streamiksi.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— tulosvirran alkioiden tyyppi;Function<? super T, ? extends Stream<? extends R>> mapper— funktio, joka ottaa alkuperäisen virran alkion (T) ja palauttaa tulosalkioiden virran (Stream<R>).
On tärkeää ymmärtää, että flatMap() ei palauta yksittäistä alkiota, vaan virran (tai muun kokoelman) jokaiselle alkiolle. 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, joilla kullakin on name ja lista products. Koska getProducts() palauttaa listan, kutsumalla stream() factories-listalle saadaan normaalisti stream Factory olioita, mikä ei ole haluttu lopputulos.
Varsinaisten tuotenimien poimimiseen käytetään flatMap(factory -> factory.getProducts().stream()). Tämä yhdistää kaikki tuotelistat yhdeksi jatkuvaksi virraksi String-arvoja.
Tämän jälkeen map(String::toUpperCase) soveltaa toUpperCase() metodia jokaiselle tuotenimelle, varmistaen että kaikki nimet ovat suuraakkosina ennen niiden keräämistä productList käyttäen toList().
Kokoelmien yhdistäminen yhdeksi
Kun data on järjestetty sisäkkäisiksi kokoelmiksi, flatMap()-metodi auttaa yhdistämään ne yhdeksi virraksi, mikä helpottaa jatko-käsittelyä. Esimerkiksi voit yhdistää taulukon, joka sisältää muita taulukoita, yhdeksi taulukoksi.
Esimerkki
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ämään eri tuotantolinjojen sisäkkäiset tuotelistat yhdeksi yhtenäiseksi virraksi.
Jokainen tuotantolinja, joka esitetään tuotelistana, muunnetaan alkioiden virraksi, joka kerätään lopuksi yhtenäiseksi listaksi käyttäen toList(). Lopputuloksena saadaan yksi lista, joka sisältää kaikki tehtaassa valmistetut tuotteet.
1. Mitä flatMap()-metodi tekee Stream API:ssa?
2. Mitä tapahtuu, kun flatMap()-metodia käytetään sisäkkäisten kokoelmien kanssa?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme