Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Sisäkkäisten Rakenteiden Käsittely FlatMap()-Menetelmällä | Välimuotoiset Operaatiot Stream API:ssa
Stream API

bookSisä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>> mapperfunktio, 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

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, 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

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ää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?

question mark

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

Select the correct answer

question mark

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

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 4

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Awesome!

Completion rate improved to 2.33

bookSisä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>> mapperfunktio, 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

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, 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

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ää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?

question mark

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

Select the correct answer

question mark

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

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 4
some-alt