Collectors-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
1234567891011121314151617181920package 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
12345678910111213141516171819202122package 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
123456789101112131415161718package 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
12345678910111213141516171819202122package 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
12345678910111213141516package 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?
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
Collectors-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
1234567891011121314151617181920package 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
12345678910111213141516171819202122package 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
123456789101112131415161718package 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
12345678910111213141516171819202122package 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
12345678910111213141516package 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?
Kiitos palautteestasi!