Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Aggregere Elementer med Reduce()-Metoden | Terminaloperasjoner i Stream API
Stream-API

bookAggregere Elementer med Reduce()-Metoden

Når du arbeider med samlinger i Java, må du ofte aggregere alle elementene til et enkelt resultat, for eksempel en sum, et produkt eller en annen aggregert verdi.

Det finnes tre varianter av reduce()-metoden, hver tilpasset ulike scenarier. La oss gå gjennom hver av dem i detalj.

reduce() med én parameter

Hvis du trenger å aggregere elementer uten en startverdi, kan du bruke denne versjonen av reduce(). Siden strømmen kan være tom, returnerer metoden en Optional<T>.

Optional<T> reduce(BinaryOperator<T> accumulator);

Denne metoden anvender accumulator-funksjonen på alle elementene i strømmen og returnerer en Optional<T>.

Praktisk eksempel

Tenk deg en nettbutikk med en liste over produkter og deres priser. Målet er å beregne den totale omsetningen for alle produktene i butikken.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738
package com.example; import java.util.List; import java.util.Optional; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); Optional<Double> totalRevenue = products.stream() .map(Product::getPrice) .reduce(Double::sum); totalRevenue.ifPresent(revenue -> System.out.println("Total revenue: " + revenue)); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }

Denne koden oppretter en liste med produkter, og bruker deretter reduce() for å summere prisene. Metoden map(Product::getPrice) henter ut prisen til hvert produkt, mens Double::sum utfører summeringen. Hvis resultatet er til stede, blir det skrevet ut.

reduce() med to parametere

Hvis du ønsker å sikre en garantert returverdi, selv når strømmen er tom, bruk reduce()-metoden med en identitetsparameter. Startverdien sikrer en stabil beregning.

T reduce(T identity, BinaryOperator<T> accumulator);

Denne versjonen av reduce() starter med den angitte identity-verdien, noe som sikrer at et resultat alltid returneres, selv for en tom strøm.

Praktisk eksempel

Anta at en butikk har en kasse med en startsaldo, og du må legge til den totale prisen på alle produkter for å finne ut potensiell total kontantbeholdning.

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728293031323334353637
package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); double totalRevenue = products.stream() .map(Product::getPrice) .reduce(500.0, Double::sum); System.out.println("Total revenue with initial balance: " + totalRevenue); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }

Her henter koden ut priser med map(Product::getPrice) og bruker reduce(500.0, Double::sum), der 500.0 representerer startsaldoen, og Double::sum summerer verdiene.

reduce() for parallell behandling

Denne versjonen av reduce() er utviklet for tilfeller der det kreves mer komplekse transformasjoner, og resultateraggregere i parallell.

<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);

Denne metoden tar tre parametere:

  • identitystartverdi;
  • accumulator – en funksjon som transformerer hvert element;
  • combiner – en funksjon som slår sammen delresultater.

Praktisk eksempel

I en nettbutikk er det behov for å beregne det totale antallet tegn i alle produktnavn. Dette kan være nyttig for å sette begrensningerkvitteringslengde.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536
package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); int totalLength = products.stream() .reduce(0, (sum, product) -> sum + product.getName().length(), Integer::sum); System.out.println("Total name length: " + totalLength); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }

Koden itererer gjennom listen av produkter ved bruk av reduce(), der 0 er initialverdien, (sum, product) -> sum + product.getName().length() definerer logikken for summering av lengdeneproduktnavnene, og Integer::sum kombinerer resultatene i et parallelt prosesseringsmiljø.

1. Hvilken datatype returnerer reduce(BinaryOperator<T> accumulator) hvis strømmen kan være tom?

2. Når bør du bruke reduce(T identity, BinaryOperator<T> accumulator)?

question mark

Hvilken datatype returnerer reduce(BinaryOperator<T> accumulator) hvis strømmen kan være tom?

Select the correct answer

question mark

Når bør du bruke reduce(T identity, BinaryOperator<T> accumulator)?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 6

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

bookAggregere Elementer med Reduce()-Metoden

Sveip for å vise menyen

Når du arbeider med samlinger i Java, må du ofte aggregere alle elementene til et enkelt resultat, for eksempel en sum, et produkt eller en annen aggregert verdi.

Det finnes tre varianter av reduce()-metoden, hver tilpasset ulike scenarier. La oss gå gjennom hver av dem i detalj.

reduce() med én parameter

Hvis du trenger å aggregere elementer uten en startverdi, kan du bruke denne versjonen av reduce(). Siden strømmen kan være tom, returnerer metoden en Optional<T>.

Optional<T> reduce(BinaryOperator<T> accumulator);

Denne metoden anvender accumulator-funksjonen på alle elementene i strømmen og returnerer en Optional<T>.

Praktisk eksempel

Tenk deg en nettbutikk med en liste over produkter og deres priser. Målet er å beregne den totale omsetningen for alle produktene i butikken.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738
package com.example; import java.util.List; import java.util.Optional; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); Optional<Double> totalRevenue = products.stream() .map(Product::getPrice) .reduce(Double::sum); totalRevenue.ifPresent(revenue -> System.out.println("Total revenue: " + revenue)); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }

Denne koden oppretter en liste med produkter, og bruker deretter reduce() for å summere prisene. Metoden map(Product::getPrice) henter ut prisen til hvert produkt, mens Double::sum utfører summeringen. Hvis resultatet er til stede, blir det skrevet ut.

reduce() med to parametere

Hvis du ønsker å sikre en garantert returverdi, selv når strømmen er tom, bruk reduce()-metoden med en identitetsparameter. Startverdien sikrer en stabil beregning.

T reduce(T identity, BinaryOperator<T> accumulator);

Denne versjonen av reduce() starter med den angitte identity-verdien, noe som sikrer at et resultat alltid returneres, selv for en tom strøm.

Praktisk eksempel

Anta at en butikk har en kasse med en startsaldo, og du må legge til den totale prisen på alle produkter for å finne ut potensiell total kontantbeholdning.

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728293031323334353637
package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); double totalRevenue = products.stream() .map(Product::getPrice) .reduce(500.0, Double::sum); System.out.println("Total revenue with initial balance: " + totalRevenue); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }

Her henter koden ut priser med map(Product::getPrice) og bruker reduce(500.0, Double::sum), der 500.0 representerer startsaldoen, og Double::sum summerer verdiene.

reduce() for parallell behandling

Denne versjonen av reduce() er utviklet for tilfeller der det kreves mer komplekse transformasjoner, og resultateraggregere i parallell.

<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);

Denne metoden tar tre parametere:

  • identitystartverdi;
  • accumulator – en funksjon som transformerer hvert element;
  • combiner – en funksjon som slår sammen delresultater.

Praktisk eksempel

I en nettbutikk er det behov for å beregne det totale antallet tegn i alle produktnavn. Dette kan være nyttig for å sette begrensningerkvitteringslengde.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536
package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); int totalLength = products.stream() .reduce(0, (sum, product) -> sum + product.getName().length(), Integer::sum); System.out.println("Total name length: " + totalLength); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }

Koden itererer gjennom listen av produkter ved bruk av reduce(), der 0 er initialverdien, (sum, product) -> sum + product.getName().length() definerer logikken for summering av lengdeneproduktnavnene, og Integer::sum kombinerer resultatene i et parallelt prosesseringsmiljø.

1. Hvilken datatype returnerer reduce(BinaryOperator<T> accumulator) hvis strømmen kan være tom?

2. Når bør du bruke reduce(T identity, BinaryOperator<T> accumulator)?

question mark

Hvilken datatype returnerer reduce(BinaryOperator<T> accumulator) hvis strømmen kan være tom?

Select the correct answer

question mark

Når bør du bruke reduce(T identity, BinaryOperator<T> accumulator)?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 6
some-alt