Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Collectors-Hulpprogrammaklasse voor Stream API | Sectie
Stream-API in Java

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

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); } }

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

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); } }

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

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)); } }

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

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); } }

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

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); } }

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?

question mark

Wat doet de volgende code?

Select the correct answer

question mark

Welke Collectors-methode moet worden gebruikt om producten te groeperen op hun eerste letter?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 1. Hoofdstuk 29

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 1. Hoofdstuk 29
some-alt