Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Collectors-apuluokka Stream API:lle | Stream API:n Pääteoperaatiot
Stream API

bookCollectors-apuluokka Stream API:lle

Stream API:n collect()-metodi on jo entuudestaan tuttu tehokkaana työkaluna virran alkioiden keräämiseen käteviin tietorakenteisiin. Kuitenkin collect() vaatii Collector-toteutuksen, mikä voi tehdä prosessista monimutkaisemman.

Tässä kohtaa Collectors-luokka on hyödyllinen, sillä se tarjoaa joukon valmiita toteutuksia yleisimpiin operaatioihin. Se yksinkertaistaa tehtäviä, kuten tietojen keräämistä kokoelmiin, ryhmittelyä ja laskentaa, tehden näistä toiminnoista huomattavasti suoraviivaisempia.

Collectors-luokan keskeiset metodit

Collectors-luokka tarjoaa lukuisia valmiita ratkaisuja, jolloin Collector-toteutusta ei tarvitse tehdä itse. Tässä joitakin keskeisiä metodeja:

Stream API tarjoaa myös sisäänrakennetun toList()-metodin, jota olet käyttänyt aiemmin. Tällä metodilla on ytimekäs syntaksi, mikä tekee siitä suositellun vaihtoehdon. Voit kuitenkin vapaasti käyttää mitä tahansa toteutusta, joka parhaiten sopii tarpeisiisi.

Listan muuntaminen Mapiksi

Oletetaan, että käytössä on tuotteiden lista, jossa on hinnat merkkijonoina muodossa Name=Price. Tavoitteena on luoda Map, jossa avain on tuotteen nimi ja arvo on sen hinta.

Main.java

Main.java

copy
1234567891011121314151617181920
package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> productData = List.of("Laptop:1500", "Smartphone:900", "Monitor:1200"); // Convert the list of strings into a `Map` by splitting the string at "=" Map<String, Integer> productPriceMap = productData.stream() .collect(Collectors.toMap( item -> item.split(":")[0], // Key - product name item -> Integer.parseInt(item.split(":")[1]) // Value - price )); System.out.println("Product Map: " + productPriceMap); } }

Tässä käytetään toMap()-metodia jakamaan jokainen merkkijono (split("=")) ja luomaan Map<String, Integer>, jossa avain on tuotteen nimi ja arvo on sen hinta kokonaislukuna. Esimerkiksi merkkijono Laptop=1500 muuttuu merkinnäksi Laptop -> 1500.

Tuotteiden ryhmittely ensimmäisen kirjaimen mukaan

Ryhmitellään tuotteet niiden ensimmäisen kirjaimen perusteella, jotta nähdään, mitkä tuotteet alkavat samalla kirjaimella.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Drone", "Smartphone", "Smartwatch", "Monitor", "Mouse" ); // Grouping products by the first letter of their name Map<Character, List<String>> groupedProducts = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0))); System.out.println("Products grouped by first letter: " + groupedProducts); } }

Ohjelma luo List-tyyppisen tuotenimien kokoelman ja ryhmittelee ne ensimmäisen kirjaimen perusteella käyttäen groupingBy()-metodia. Tuloksena syntyy Map, jossa avain on charAt(0) ja arvo on lista vastaavista tuotteista. Lopuksi ryhmitellyt tuotteet tulostetaan.

Hintojen jakaminen

Collectors.partitioningBy on erityinen keräin Stream API:ssa, joka jakaa alkiot kahteen ryhmään annetun predikaatin perusteella.

 Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
         .collect(Collectors.partitioningBy(price -> price > 1000));

Se palauttaa Map<Boolean, List<T>>-rakenteen, jossa true edustaa ehtoon täyttäviä alkioita ja false niitä, jotka eivät täytä ehtoa.

Tätä voidaan hyödyntää datan erotteluun, kuten parillisten ja parittomien lukujen tai korkea- ja matalahintaisten tuotteiden suodattamiseen.

Esimerkki

Jaetaan tuotteiden hinnat kahteen kategoriaan: kalliit (yli 1000 $) ja halvat (1000 $ tai vähemmän).

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> prices = List.of(1500, 900, 1200, 1100, 300); // Partition prices into expensive and cheap categories Map<Boolean, List<Integer>> partitionedPrices = prices.stream() .collect(Collectors.partitioningBy(price -> price > 1000)); System.out.println("Expensive products: " + partitionedPrices.get(true)); System.out.print("Cheap products: " + partitionedPrices.get(false)); } }

Metodi partitioningBy() jakaa hinnat-listan kahteen ryhmään. Jos hinta on yli 1000, se sijoitetaan avaimen true alle; muussa tapauksessa se menee avaimen false alle.

Tuotteiden laskeminen

Lasketaan, kuinka monta tuotetta alkaa samalla kirjaimella.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Dishwasher", "Drone", "Smartphone", "Smartwatch", "Speaker", "Monitor", "Mouse", "Microphone" ); // Count how many products start with each letter Map<Character, Long> countByLetter = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0), Collectors.counting())); System.out.println("Product count by first letter: " + countByLetter); } }

Ohjelma käsittelee List-tyyppistä tuotteiden listaa käyttäen stream()-metodia, jonka jälkeen sovelletaan groupingBy()-toimintoa charAt(0)-funktion kanssa ryhmitelläkseen sanat niiden ensimmäisen kirjaimen perusteella. counting()-kerääjä laskee, kuinka monta tuotetta kuuluu kuhunkin ryhmään, ja lopullinen Map tallentaa kirjaimen avaimeksi ja määrän arvoksi.

Tuotenimien yhdistäminen

Yhdistetään tuotenimet yhdeksi merkkijonoksi, erottaen ne pilkuilla.

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of("Laptop", "Smartphone", "Monitor"); // Join product names into a single comma-separated string String productNames = products.stream() .collect(Collectors.joining(", ")); System.out.println("Product list: " + productNames); } }

Collectors.joining(", ")-metodi yhdistää kaikki tuotenimet yhdeksi merkkijonoksi, erottaen ne pilkuilla. Lopuksi muodostunut merkkijono tulostetaan esittämään tuotelista luettavassa muodossa.

1. Mitä seuraava koodi tekee?

2. Mitä Collectors-metodia tulisi käyttää tuotteiden ryhmittelyyn niiden ensimmäisen kirjaimen mukaan?

question mark

Mitä seuraava koodi tekee?

Select the correct answer

question mark

Mitä Collectors-metodia tulisi käyttää tuotteiden ryhmittelyyn niiden ensimmäisen kirjaimen mukaan?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 3

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

bookCollectors-apuluokka Stream API:lle

Pyyhkäise näyttääksesi valikon

Stream API:n collect()-metodi on jo entuudestaan tuttu tehokkaana työkaluna virran alkioiden keräämiseen käteviin tietorakenteisiin. Kuitenkin collect() vaatii Collector-toteutuksen, mikä voi tehdä prosessista monimutkaisemman.

Tässä kohtaa Collectors-luokka on hyödyllinen, sillä se tarjoaa joukon valmiita toteutuksia yleisimpiin operaatioihin. Se yksinkertaistaa tehtäviä, kuten tietojen keräämistä kokoelmiin, ryhmittelyä ja laskentaa, tehden näistä toiminnoista huomattavasti suoraviivaisempia.

Collectors-luokan keskeiset metodit

Collectors-luokka tarjoaa lukuisia valmiita ratkaisuja, jolloin Collector-toteutusta ei tarvitse tehdä itse. Tässä joitakin keskeisiä metodeja:

Stream API tarjoaa myös sisäänrakennetun toList()-metodin, jota olet käyttänyt aiemmin. Tällä metodilla on ytimekäs syntaksi, mikä tekee siitä suositellun vaihtoehdon. Voit kuitenkin vapaasti käyttää mitä tahansa toteutusta, joka parhaiten sopii tarpeisiisi.

Listan muuntaminen Mapiksi

Oletetaan, että käytössä on tuotteiden lista, jossa on hinnat merkkijonoina muodossa Name=Price. Tavoitteena on luoda Map, jossa avain on tuotteen nimi ja arvo on sen hinta.

Main.java

Main.java

copy
1234567891011121314151617181920
package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> productData = List.of("Laptop:1500", "Smartphone:900", "Monitor:1200"); // Convert the list of strings into a `Map` by splitting the string at "=" Map<String, Integer> productPriceMap = productData.stream() .collect(Collectors.toMap( item -> item.split(":")[0], // Key - product name item -> Integer.parseInt(item.split(":")[1]) // Value - price )); System.out.println("Product Map: " + productPriceMap); } }

Tässä käytetään toMap()-metodia jakamaan jokainen merkkijono (split("=")) ja luomaan Map<String, Integer>, jossa avain on tuotteen nimi ja arvo on sen hinta kokonaislukuna. Esimerkiksi merkkijono Laptop=1500 muuttuu merkinnäksi Laptop -> 1500.

Tuotteiden ryhmittely ensimmäisen kirjaimen mukaan

Ryhmitellään tuotteet niiden ensimmäisen kirjaimen perusteella, jotta nähdään, mitkä tuotteet alkavat samalla kirjaimella.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Drone", "Smartphone", "Smartwatch", "Monitor", "Mouse" ); // Grouping products by the first letter of their name Map<Character, List<String>> groupedProducts = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0))); System.out.println("Products grouped by first letter: " + groupedProducts); } }

Ohjelma luo List-tyyppisen tuotenimien kokoelman ja ryhmittelee ne ensimmäisen kirjaimen perusteella käyttäen groupingBy()-metodia. Tuloksena syntyy Map, jossa avain on charAt(0) ja arvo on lista vastaavista tuotteista. Lopuksi ryhmitellyt tuotteet tulostetaan.

Hintojen jakaminen

Collectors.partitioningBy on erityinen keräin Stream API:ssa, joka jakaa alkiot kahteen ryhmään annetun predikaatin perusteella.

 Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
         .collect(Collectors.partitioningBy(price -> price > 1000));

Se palauttaa Map<Boolean, List<T>>-rakenteen, jossa true edustaa ehtoon täyttäviä alkioita ja false niitä, jotka eivät täytä ehtoa.

Tätä voidaan hyödyntää datan erotteluun, kuten parillisten ja parittomien lukujen tai korkea- ja matalahintaisten tuotteiden suodattamiseen.

Esimerkki

Jaetaan tuotteiden hinnat kahteen kategoriaan: kalliit (yli 1000 $) ja halvat (1000 $ tai vähemmän).

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> prices = List.of(1500, 900, 1200, 1100, 300); // Partition prices into expensive and cheap categories Map<Boolean, List<Integer>> partitionedPrices = prices.stream() .collect(Collectors.partitioningBy(price -> price > 1000)); System.out.println("Expensive products: " + partitionedPrices.get(true)); System.out.print("Cheap products: " + partitionedPrices.get(false)); } }

Metodi partitioningBy() jakaa hinnat-listan kahteen ryhmään. Jos hinta on yli 1000, se sijoitetaan avaimen true alle; muussa tapauksessa se menee avaimen false alle.

Tuotteiden laskeminen

Lasketaan, kuinka monta tuotetta alkaa samalla kirjaimella.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Dishwasher", "Drone", "Smartphone", "Smartwatch", "Speaker", "Monitor", "Mouse", "Microphone" ); // Count how many products start with each letter Map<Character, Long> countByLetter = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0), Collectors.counting())); System.out.println("Product count by first letter: " + countByLetter); } }

Ohjelma käsittelee List-tyyppistä tuotteiden listaa käyttäen stream()-metodia, jonka jälkeen sovelletaan groupingBy()-toimintoa charAt(0)-funktion kanssa ryhmitelläkseen sanat niiden ensimmäisen kirjaimen perusteella. counting()-kerääjä laskee, kuinka monta tuotetta kuuluu kuhunkin ryhmään, ja lopullinen Map tallentaa kirjaimen avaimeksi ja määrän arvoksi.

Tuotenimien yhdistäminen

Yhdistetään tuotenimet yhdeksi merkkijonoksi, erottaen ne pilkuilla.

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of("Laptop", "Smartphone", "Monitor"); // Join product names into a single comma-separated string String productNames = products.stream() .collect(Collectors.joining(", ")); System.out.println("Product list: " + productNames); } }

Collectors.joining(", ")-metodi yhdistää kaikki tuotenimet yhdeksi merkkijonoksi, erottaen ne pilkuilla. Lopuksi muodostunut merkkijono tulostetaan esittämään tuotelista luettavassa muodossa.

1. Mitä seuraava koodi tekee?

2. Mitä Collectors-metodia tulisi käyttää tuotteiden ryhmittelyyn niiden ensimmäisen kirjaimen mukaan?

question mark

Mitä seuraava koodi tekee?

Select the correct answer

question mark

Mitä Collectors-metodia tulisi käyttää tuotteiden ryhmittelyyn niiden ensimmäisen kirjaimen mukaan?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 3
some-alt