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 biedt de Collectors-klasse uitkomst, door een reeks vooraf gebouwde implementaties te leveren voor de meest voorkomende bewerkingen. Dit vereenvoudigt taken zoals het verzamelen van data in collecties, groeperen en tellen, waardoor deze handelingen veel eenvoudiger worden.
Belangrijkste methoden van de Collectors-klasse
De Collectors-klasse biedt tal van kant-en-klare oplossingen, waardoor het handmatig implementeren van een Collector overbodig wordt. Hier volgen enkele van de belangrijkste methoden:
De Stream API biedt ook de ingebouwde toList()-methode, die eerder is gebruikt. Deze methode heeft een beknopte syntaxis en is daarom onze voorkeursoptie. Uiteraard kan elke implementatie worden gekozen die het beste aansluit bij de behoeften.
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 daarvan.
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 wordt toMap() gebruikt 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 het item Laptop -> 1500.
Producten groeperen op eerste letter
Producten groeperen op basis van 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));
Het retourneert een Map<Boolean, List<T>>, waarbij true staat voor elementen die voldoen aan de conditie, 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
Productprijzen worden 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 bepalen 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.