Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Collectors-verktøyklasse for Stream API | Terminaloperasjoner i Stream API
Stream-API

bookCollectors-verktøyklasse for Stream API

Metoden collect() i Stream API er allerede kjent som et kraftig verktøy for å samle elementer fra en strøm i praktiske datastrukturer. Likevel krever collect() en Collector-implementasjon, noe som kan gjøre prosessen mer kompleks.

Her kommer klassen Collectors til nytte, ved å tilby et sett med ferdiglagde implementasjoner for de vanligste operasjonene. Dette forenkler oppgaver som å samle data i samlinger, gruppering og telling, og gjør slike operasjoner langt mer oversiktlige.

Viktige metoder i Collectors-klassen

Klassen Collectors tilbyr en rekke ferdige løsninger, slik at man slipper å implementere en Collector manuelt. Her er noen av de viktigste metodene:

Stream API tilbyr også den innebygde metoden toList(), som du har brukt tidligere. Denne metoden har en kortfattet syntaks, og er vårt foretrukne valg. Du står likevel fritt til å bruke den implementasjonen som passer best til ditt behov.

Konvertere en liste til et kart

Anta at du har en liste med produkter og deres priser, lagret som strenger i formatet Name=Price. Målet er å opprette et Map der nøkkelen er produktnavnet og verdien er prisen.

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 brukes toMap() for å dele opp hver streng (split("=")) og opprette et Map<String, Integer>, der nøkkelen er produktnavnet og verdien er prisen som et heltall. For eksempel blir strengen Laptop=1500 til oppføringen Laptop -> 1500.

Gruppering av produkter etter første bokstav

La oss gruppere produkter etter første bokstav for å se hvilke varer som starter med samme bokstav.

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 oppretter en List med produktnavn og grupperer dem etter første bokstav ved hjelp av groupingBy(). Resultatet lagres i en Map, hvor nøkkelen er charAt(0), og verdien er en liste over samsvarende produkter. Til slutt skrives de grupperte produktene ut.

Oppdeling av priser

Collectors.partitioningBy er en spesiell collector i Stream API som deler elementer inn i to grupper basert på et gitt predikat.

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

Den returnerer en Map<Boolean, List<T>>, hvor true representerer elementer som oppfyller betingelsen, og false representerer de som ikke gjør det.

Dette er nyttig for å separere data, som for eksempel å filtrere partall og oddetall eller dyre og rimelige produkter.

Eksempel

Vi skal dele opp produktpriser i to kategorier: dyre (større enn $1000) og rimelige ($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 prislisten i to grupper. Hvis en pris er større enn 1000, plasseres den under nøkkelen true; ellers havner den under false.

Telling av produkter

La oss telle hvor mange produkter som begynner med samme bokstav.

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 av produkter ved å bruke stream(), deretter anvendes groupingBy() med charAt(0) for å gruppere ordene etter første bokstav. counting()-samleren teller hvor mange produkter som havner i hver gruppe, og den endelige Map lagrer bokstaven som nøkkel og antallet som verdi.

Sammenføying av produktnavn

Sammenkobling av produktnavn til én streng, adskilt med komma.

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 slår sammen alle produktnavn til en enkelt streng, adskilt med kommaer. Til slutt blir den resulterende strengen skrevet ut for å vise produktlisten i et lesbart format.

1. Hva gjør følgende kode?

2. Hvilken Collectors-metode bør brukes for å gruppere produkter etter første bokstav?

question mark

Hva gjør følgende kode?

Select the correct answer

question mark

Hvilken Collectors-metode bør brukes for å gruppere produkter etter første bokstav?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 3

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 2.33

bookCollectors-verktøyklasse for Stream API

Sveip for å vise menyen

Metoden collect() i Stream API er allerede kjent som et kraftig verktøy for å samle elementer fra en strøm i praktiske datastrukturer. Likevel krever collect() en Collector-implementasjon, noe som kan gjøre prosessen mer kompleks.

Her kommer klassen Collectors til nytte, ved å tilby et sett med ferdiglagde implementasjoner for de vanligste operasjonene. Dette forenkler oppgaver som å samle data i samlinger, gruppering og telling, og gjør slike operasjoner langt mer oversiktlige.

Viktige metoder i Collectors-klassen

Klassen Collectors tilbyr en rekke ferdige løsninger, slik at man slipper å implementere en Collector manuelt. Her er noen av de viktigste metodene:

Stream API tilbyr også den innebygde metoden toList(), som du har brukt tidligere. Denne metoden har en kortfattet syntaks, og er vårt foretrukne valg. Du står likevel fritt til å bruke den implementasjonen som passer best til ditt behov.

Konvertere en liste til et kart

Anta at du har en liste med produkter og deres priser, lagret som strenger i formatet Name=Price. Målet er å opprette et Map der nøkkelen er produktnavnet og verdien er prisen.

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 brukes toMap() for å dele opp hver streng (split("=")) og opprette et Map<String, Integer>, der nøkkelen er produktnavnet og verdien er prisen som et heltall. For eksempel blir strengen Laptop=1500 til oppføringen Laptop -> 1500.

Gruppering av produkter etter første bokstav

La oss gruppere produkter etter første bokstav for å se hvilke varer som starter med samme bokstav.

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 oppretter en List med produktnavn og grupperer dem etter første bokstav ved hjelp av groupingBy(). Resultatet lagres i en Map, hvor nøkkelen er charAt(0), og verdien er en liste over samsvarende produkter. Til slutt skrives de grupperte produktene ut.

Oppdeling av priser

Collectors.partitioningBy er en spesiell collector i Stream API som deler elementer inn i to grupper basert på et gitt predikat.

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

Den returnerer en Map<Boolean, List<T>>, hvor true representerer elementer som oppfyller betingelsen, og false representerer de som ikke gjør det.

Dette er nyttig for å separere data, som for eksempel å filtrere partall og oddetall eller dyre og rimelige produkter.

Eksempel

Vi skal dele opp produktpriser i to kategorier: dyre (større enn $1000) og rimelige ($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 prislisten i to grupper. Hvis en pris er større enn 1000, plasseres den under nøkkelen true; ellers havner den under false.

Telling av produkter

La oss telle hvor mange produkter som begynner med samme bokstav.

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 av produkter ved å bruke stream(), deretter anvendes groupingBy() med charAt(0) for å gruppere ordene etter første bokstav. counting()-samleren teller hvor mange produkter som havner i hver gruppe, og den endelige Map lagrer bokstaven som nøkkel og antallet som verdi.

Sammenføying av produktnavn

Sammenkobling av produktnavn til én streng, adskilt med komma.

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 slår sammen alle produktnavn til en enkelt streng, adskilt med kommaer. Til slutt blir den resulterende strengen skrevet ut for å vise produktlisten i et lesbart format.

1. Hva gjør følgende kode?

2. Hvilken Collectors-metode bør brukes for å gruppere produkter etter første bokstav?

question mark

Hva gjør følgende kode?

Select the correct answer

question mark

Hvilken Collectors-metode bør brukes for å gruppere produkter etter første bokstav?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 3
some-alt