Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Collectors Hjælpeklasse til Stream API | Terminale Operationer i Stream API'et
Stream API

bookCollectors Hjælpeklasse til Stream API

Metoden collect() i Stream API er allerede kendt som et kraftfuldt værktøj til at samle elementer fra en stream i praktiske datastrukturer. Dog kræver collect() selv en Collector-implementering, hvilket kan gøre processen mere kompleks.

Her er Collectors-klassen nyttig, da den tilbyder et sæt foruddefinerede implementeringer til de mest almindelige operationer. Den forenkler opgaver som at samle data i samlinger, gruppering og optælling, hvilket gør disse operationer langt mere ligetil.

Centrale metoder i Collectors-klassen

Collectors-klassen tilbyder adskillige færdige løsninger, så det ikke er nødvendigt manuelt at implementere en Collector. Her er nogle af de vigtigste metoder:

Stream API tilbyder også den indbyggede metode toList(), som du har brugt før. Denne metode har en kortfattet syntaks, hvilket gør den til vores foretrukne valg. Du er dog fri til at anvende enhver implementering, der passer bedst til dine behov.

Konvertering af en liste til et map

Antag, at du har en liste af produkter med deres priser, gemt som strenge i formatet Name=Price. Målet er at oprette et Map, hvor nøglen er produktnavnet og værdien er dets pris.

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

Her bruges toMap() til at opdele hver streng (split("=")) og oprette et Map<String, Integer>, hvor nøglen er produktnavnet og værdien er dets pris som et heltal. For eksempel omdannes strengen Laptop=1500 til en post Laptop -> 1500.

Gruppering af produkter efter første bogstav

Lad os gruppere produkter efter deres første bogstav for at se, hvilke varer der starter med det samme bogstav.

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

Programmet opretter en List med produktnavne og grupperer dem efter deres første bogstav ved hjælp af groupingBy(). Resultatet gemmes i et Map, hvor nøglen er charAt(0), og værdien er en liste af tilsvarende produkter. Til sidst udskrives de grupperede produkter.

Opdeling af priser

Collectors.partitioningBy er en speciel collector i Stream API, der opdeler elementer i to grupper baseret på et givet predikat.

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

Den returnerer et Map<Boolean, List<T>>, hvor true repræsenterer elementer, der opfylder betingelsen, og false repræsenterer dem, der ikke gør.

Dette er nyttigt til adskillelse af data, såsom filtrering af lige og ulige tal eller dyre og billige produkter.

Eksempel

Lad os opdele produktpriser i to kategorier: dyre (større end $1000) og billige ($1000 eller mindre).

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

Metoden partitioningBy() deler prisliste op i to grupper. Hvis en pris er større end 1000, placeres den under nøglen true; ellers placeres den under false.

Optælling af produkter

Lad os tælle, hvor mange produkter der starter med det samme bogstav.

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

Programmet behandler List af produkter ved hjælp af stream(), anvender derefter groupingBy() med charAt(0) for at gruppere ord efter deres første bogstav. counting()-samleren tæller, hvor mange produkter der falder i hver gruppe, og den endelige Map gemmer bogstavet som en nøgle og antallet som en værdi.

Sammenkædning af produktnavne

Lad os sammenkæde produktnavne til en enkelt streng, adskilt med kommaer.

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(", ")-metoden sammenkæder alle produktnavne til en enkelt streng, adskilt med kommaer. Til sidst udskrives den resulterende streng for at vise produktlisten i et læsbart format.

1. Hvad gør følgende kode?

2. Hvilken Collectors-metode skal bruges til at gruppere produkter efter deres første bogstav?

question mark

Hvad gør følgende kode?

Select the correct answer

question mark

Hvilken Collectors-metode skal bruges til at gruppere produkter efter deres første bogstav?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Suggested prompts:

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

bookCollectors Hjælpeklasse til Stream API

Stryg for at vise menuen

Metoden collect() i Stream API er allerede kendt som et kraftfuldt værktøj til at samle elementer fra en stream i praktiske datastrukturer. Dog kræver collect() selv en Collector-implementering, hvilket kan gøre processen mere kompleks.

Her er Collectors-klassen nyttig, da den tilbyder et sæt foruddefinerede implementeringer til de mest almindelige operationer. Den forenkler opgaver som at samle data i samlinger, gruppering og optælling, hvilket gør disse operationer langt mere ligetil.

Centrale metoder i Collectors-klassen

Collectors-klassen tilbyder adskillige færdige løsninger, så det ikke er nødvendigt manuelt at implementere en Collector. Her er nogle af de vigtigste metoder:

Stream API tilbyder også den indbyggede metode toList(), som du har brugt før. Denne metode har en kortfattet syntaks, hvilket gør den til vores foretrukne valg. Du er dog fri til at anvende enhver implementering, der passer bedst til dine behov.

Konvertering af en liste til et map

Antag, at du har en liste af produkter med deres priser, gemt som strenge i formatet Name=Price. Målet er at oprette et Map, hvor nøglen er produktnavnet og værdien er dets pris.

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

Her bruges toMap() til at opdele hver streng (split("=")) og oprette et Map<String, Integer>, hvor nøglen er produktnavnet og værdien er dets pris som et heltal. For eksempel omdannes strengen Laptop=1500 til en post Laptop -> 1500.

Gruppering af produkter efter første bogstav

Lad os gruppere produkter efter deres første bogstav for at se, hvilke varer der starter med det samme bogstav.

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

Programmet opretter en List med produktnavne og grupperer dem efter deres første bogstav ved hjælp af groupingBy(). Resultatet gemmes i et Map, hvor nøglen er charAt(0), og værdien er en liste af tilsvarende produkter. Til sidst udskrives de grupperede produkter.

Opdeling af priser

Collectors.partitioningBy er en speciel collector i Stream API, der opdeler elementer i to grupper baseret på et givet predikat.

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

Den returnerer et Map<Boolean, List<T>>, hvor true repræsenterer elementer, der opfylder betingelsen, og false repræsenterer dem, der ikke gør.

Dette er nyttigt til adskillelse af data, såsom filtrering af lige og ulige tal eller dyre og billige produkter.

Eksempel

Lad os opdele produktpriser i to kategorier: dyre (større end $1000) og billige ($1000 eller mindre).

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

Metoden partitioningBy() deler prisliste op i to grupper. Hvis en pris er større end 1000, placeres den under nøglen true; ellers placeres den under false.

Optælling af produkter

Lad os tælle, hvor mange produkter der starter med det samme bogstav.

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

Programmet behandler List af produkter ved hjælp af stream(), anvender derefter groupingBy() med charAt(0) for at gruppere ord efter deres første bogstav. counting()-samleren tæller, hvor mange produkter der falder i hver gruppe, og den endelige Map gemmer bogstavet som en nøgle og antallet som en værdi.

Sammenkædning af produktnavne

Lad os sammenkæde produktnavne til en enkelt streng, adskilt med kommaer.

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(", ")-metoden sammenkæder alle produktnavne til en enkelt streng, adskilt med kommaer. Til sidst udskrives den resulterende streng for at vise produktlisten i et læsbart format.

1. Hvad gør følgende kode?

2. Hvilken Collectors-metode skal bruges til at gruppere produkter efter deres første bogstav?

question mark

Hvad gør følgende kode?

Select the correct answer

question mark

Hvilken Collectors-metode skal bruges til at gruppere produkter efter deres første bogstav?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 3
some-alt