Collectors-Hulpprogrammaklasse voor Stream-API
De collect()-methode in de Stream API is reeds bekend als een krachtig hulpmiddel voor het verzamelen van stream-elementen in handige datastructuren. Echter, collect() vereist zelf een Collector-implementatie, wat het proces complexer kan maken.
Hier komt de Collectors-klasse van pas, die een reeks vooraf gebouwde implementaties biedt voor de meest voorkomende bewerkingen. Dit vereenvoudigt taken zoals het verzamelen van gegevens in collecties, groeperen en tellen, waardoor deze operaties veel eenvoudiger worden.
Belangrijkste methoden van de Collectors-klasse
De Collectors-klasse biedt talrijke kant-en-klare oplossingen, waardoor handmatige implementatie van een Collector overbodig wordt. Hier volgen enkele van de belangrijkste methoden:
De Stream API biedt ook de ingebouwde toList()-methode, die je eerder hebt gebruikt. Deze methode heeft een beknopte syntaxis, waardoor het onze voorkeurskeuze is. Je bent echter vrij om elke implementatie te gebruiken die het beste bij jouw behoeften past.
Een lijst omzetten naar een Map
Stel, je hebt een lijst van producten met hun prijzen, opgeslagen als strings in het formaat Name=Price. Het doel is om een Map te maken waarbij de sleutel de productnaam is en de waarde de prijs.
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); } }
Hier gebruik je toMap() om elke string te splitsen (split("=")) en een Map<String, Integer> te creëren, waarbij de sleutel de productnaam is en de waarde de prijs als integer. Bijvoorbeeld, de string Laptop=1500 wordt omgezet naar een entry Laptop -> 1500.
Producten groeperen op eerste letter
Producten groeperen op hun eerste letter om te zien welke items met dezelfde letter beginnen.
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); } }
Het programma maakt een List van productnamen en groepeert deze op hun eerste letter met behulp van groupingBy(). Het resultaat wordt opgeslagen in een Map, waarbij de sleutel charAt(0) is en de waarde een lijst van overeenkomende producten. Tot slot worden de gegroepeerde producten weergegeven.
Prijzen splitsen
Collectors.partitioningBy is een speciale collector in de Stream API die elementen splitst in twee groepen op basis van een gegeven predicaat.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Dit retourneert een Map<Boolean, List<T>>, waarbij true staat voor elementen die aan de voorwaarde voldoen, en false voor elementen die niet voldoen.
Dit is nuttig voor het scheiden van gegevens, zoals het filteren van even en oneven getallen of producten met hoge en lage prijzen.
Voorbeeld
Hier worden productprijzen verdeeld in twee categorieën: duur (meer dan $1000) en goedkoop ($1000 of minder).
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)); } }
De partitioningBy()-methode verdeelt de prijslijst in twee groepen. Als een prijs groter is dan 1000, wordt deze onder de sleutel true geplaatst; anders komt deze onder false.
Producten tellen
Het aantal producten tellen die met dezelfde letter beginnen.
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); } }
Het programma verwerkt de List van producten met behulp van stream(), past vervolgens groupingBy() toe met charAt(0) om woorden te groeperen op hun eerste letter. De counting() collector telt hoeveel producten in elke groep vallen, en de uiteindelijke Map slaat de letter op als sleutel en het aantal als waarde.
Productnamen samenvoegen
De productnamen samenvoegen tot één enkele string, gescheiden door komma's.
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); } }
De methode Collectors.joining(", ") voegt alle productnamen samen tot één enkele string, waarbij ze worden gescheiden door komma's. Ten slotte wordt de resulterende string afgedrukt om de productlijst in een leesbaar formaat weer te geven.
1. Wat doet de volgende code?
2. Welke Collectors-methode moet worden gebruikt om producten te groeperen op hun eerste letter?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Can you show examples of how to use each Collectors method?
What are some common use cases for groupingBy and partitioningBy?
How do I choose between toList(), toSet(), and toMap()?
Awesome!
Completion rate improved to 2.33
Collectors-Hulpprogrammaklasse voor Stream-API
Veeg om het menu te tonen
De collect()-methode in de Stream API is reeds bekend als een krachtig hulpmiddel voor het verzamelen van stream-elementen in handige datastructuren. Echter, collect() vereist zelf een Collector-implementatie, wat het proces complexer kan maken.
Hier komt de Collectors-klasse van pas, die een reeks vooraf gebouwde implementaties biedt voor de meest voorkomende bewerkingen. Dit vereenvoudigt taken zoals het verzamelen van gegevens in collecties, groeperen en tellen, waardoor deze operaties veel eenvoudiger worden.
Belangrijkste methoden van de Collectors-klasse
De Collectors-klasse biedt talrijke kant-en-klare oplossingen, waardoor handmatige implementatie van een Collector overbodig wordt. Hier volgen enkele van de belangrijkste methoden:
De Stream API biedt ook de ingebouwde toList()-methode, die je eerder hebt gebruikt. Deze methode heeft een beknopte syntaxis, waardoor het onze voorkeurskeuze is. Je bent echter vrij om elke implementatie te gebruiken die het beste bij jouw behoeften past.
Een lijst omzetten naar een Map
Stel, je hebt een lijst van producten met hun prijzen, opgeslagen als strings in het formaat Name=Price. Het doel is om een Map te maken waarbij de sleutel de productnaam is en de waarde de prijs.
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); } }
Hier gebruik je toMap() om elke string te splitsen (split("=")) en een Map<String, Integer> te creëren, waarbij de sleutel de productnaam is en de waarde de prijs als integer. Bijvoorbeeld, de string Laptop=1500 wordt omgezet naar een entry Laptop -> 1500.
Producten groeperen op eerste letter
Producten groeperen op hun eerste letter om te zien welke items met dezelfde letter beginnen.
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); } }
Het programma maakt een List van productnamen en groepeert deze op hun eerste letter met behulp van groupingBy(). Het resultaat wordt opgeslagen in een Map, waarbij de sleutel charAt(0) is en de waarde een lijst van overeenkomende producten. Tot slot worden de gegroepeerde producten weergegeven.
Prijzen splitsen
Collectors.partitioningBy is een speciale collector in de Stream API die elementen splitst in twee groepen op basis van een gegeven predicaat.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Dit retourneert een Map<Boolean, List<T>>, waarbij true staat voor elementen die aan de voorwaarde voldoen, en false voor elementen die niet voldoen.
Dit is nuttig voor het scheiden van gegevens, zoals het filteren van even en oneven getallen of producten met hoge en lage prijzen.
Voorbeeld
Hier worden productprijzen verdeeld in twee categorieën: duur (meer dan $1000) en goedkoop ($1000 of minder).
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)); } }
De partitioningBy()-methode verdeelt de prijslijst in twee groepen. Als een prijs groter is dan 1000, wordt deze onder de sleutel true geplaatst; anders komt deze onder false.
Producten tellen
Het aantal producten tellen die met dezelfde letter beginnen.
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); } }
Het programma verwerkt de List van producten met behulp van stream(), past vervolgens groupingBy() toe met charAt(0) om woorden te groeperen op hun eerste letter. De counting() collector telt hoeveel producten in elke groep vallen, en de uiteindelijke Map slaat de letter op als sleutel en het aantal als waarde.
Productnamen samenvoegen
De productnamen samenvoegen tot één enkele string, gescheiden door komma's.
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); } }
De methode Collectors.joining(", ") voegt alle productnamen samen tot één enkele string, waarbij ze worden gescheiden door komma's. Ten slotte wordt de resulterende string afgedrukt om de productlijst in een leesbaar formaat weer te geven.
1. Wat doet de volgende code?
2. Welke Collectors-methode moet worden gebruikt om producten te groeperen op hun eerste letter?
Bedankt voor je feedback!