Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Työskentely Sisäkkäisten Rakenteiden Kanssa FlatMap()-Menetelmällä | Osio
Stream API Javassa

bookTyö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>> mapperfunktio, 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

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536
package 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

Main.java

copy
12345678910111213141516171819202122
package 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?

question mark

Mitä flatMap()-metodi tekee Stream API:ssa?

Select the correct answer

question mark

Mitä tapahtuu, kun flatMap()-metodia käytetään sisäkkäisten kokoelmien kanssa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 19

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 1. Luku 19
some-alt