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

bookAggregering af Elementer med Reduce()-Metoden

Ved arbejde med collections i Java er det ofte nødvendigt at reducere alle elementer til et enkelt resultat, såsom en sum, et produkt eller en anden aggregeret værdi.

Der findes tre varianter af reduce()-metoden, som hver især er designet til forskellige scenarier. Her gennemgås hver enkelt i detalje.

reduce() med én parameter

Hvis det er nødvendigt at aggregere elementer uden en initialværdi, kan denne version af reduce() anvendes. Da strømmen dog kan være tom, returnerer metoden en Optional<T>.

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

Denne metode anvender accumulator-funktionen på alle elementer i strømmen og returnerer en Optional<T>.

Praktisk eksempel

Forestil dig en onlinebutik med en liste over produkter og deres priser. Målet er at beregne den samlede omsætning for alle produkter 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 kode opretter en liste af produkter, og bruger derefter reduce() til at summere priserne. Metoden map(Product::getPrice) udtrækker prisen for hvert produkt, mens Double::sum udfører summationen. Hvis resultatet er til stede, bliver det udskrevet.

reduce() med to parametre

Hvis du ønsker at sikre en garanteret returværdi, selv når strømmen er tom, skal du bruge reduce()-metoden med en identitetsparameter. Startværdien sikrer en stabil beregning.

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

Denne version af reduce() starter med den angivne identity-værdi, hvilket sikrer, at et resultat altid returneres, selv for en tom stream.

Praktisk eksempel

Antag, at en butik har en kasse med en startsaldo, og du skal lægge den samlede pris for alle produkter til for at bestemme den mulige samlede 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 udtrækker koden priser med map(Product::getPrice) og anvender reduce(500.0, Double::sum), hvor 500.0 repræsenterer startsaldoen, og Double::sum lægger værdierne sammen.

reduce() til parallel behandling

Denne version af reduce() er designet til situationer, hvor der kræves mere komplekse transformationer, og resultater skal aggregeres i parallel.

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

Denne metode tager tre parametre:

  • identitystartværdien;
  • accumulator – en funktion, der transformerer hvert element;
  • combiner – en funktion, der sammenfletter delresultater.

Praktisk eksempel

I en onlinebutik er der behov for at beregne det samlede antal tegn i alle produktnavne. Dette kan være nyttigt for at fastsætte begrænsningerkvitteringslængde.

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 gennemløber listen af produkter ved hjælp af reduce(), hvor 0 er startværdien, (sum, product) -> sum + product.getName().length() definerer logikken for opsummering af længderneproduktnavne, og Integer::sum kombinerer resultaterne i et parallelt behandlingsmiljø.

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

2. Hvornår bør du bruge 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

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

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 6

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

Awesome!

Completion rate improved to 2.33

bookAggregering af Elementer med Reduce()-Metoden

Stryg for at vise menuen

Ved arbejde med collections i Java er det ofte nødvendigt at reducere alle elementer til et enkelt resultat, såsom en sum, et produkt eller en anden aggregeret værdi.

Der findes tre varianter af reduce()-metoden, som hver især er designet til forskellige scenarier. Her gennemgås hver enkelt i detalje.

reduce() med én parameter

Hvis det er nødvendigt at aggregere elementer uden en initialværdi, kan denne version af reduce() anvendes. Da strømmen dog kan være tom, returnerer metoden en Optional<T>.

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

Denne metode anvender accumulator-funktionen på alle elementer i strømmen og returnerer en Optional<T>.

Praktisk eksempel

Forestil dig en onlinebutik med en liste over produkter og deres priser. Målet er at beregne den samlede omsætning for alle produkter 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 kode opretter en liste af produkter, og bruger derefter reduce() til at summere priserne. Metoden map(Product::getPrice) udtrækker prisen for hvert produkt, mens Double::sum udfører summationen. Hvis resultatet er til stede, bliver det udskrevet.

reduce() med to parametre

Hvis du ønsker at sikre en garanteret returværdi, selv når strømmen er tom, skal du bruge reduce()-metoden med en identitetsparameter. Startværdien sikrer en stabil beregning.

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

Denne version af reduce() starter med den angivne identity-værdi, hvilket sikrer, at et resultat altid returneres, selv for en tom stream.

Praktisk eksempel

Antag, at en butik har en kasse med en startsaldo, og du skal lægge den samlede pris for alle produkter til for at bestemme den mulige samlede 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 udtrækker koden priser med map(Product::getPrice) og anvender reduce(500.0, Double::sum), hvor 500.0 repræsenterer startsaldoen, og Double::sum lægger værdierne sammen.

reduce() til parallel behandling

Denne version af reduce() er designet til situationer, hvor der kræves mere komplekse transformationer, og resultater skal aggregeres i parallel.

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

Denne metode tager tre parametre:

  • identitystartværdien;
  • accumulator – en funktion, der transformerer hvert element;
  • combiner – en funktion, der sammenfletter delresultater.

Praktisk eksempel

I en onlinebutik er der behov for at beregne det samlede antal tegn i alle produktnavne. Dette kan være nyttigt for at fastsætte begrænsningerkvitteringslængde.

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 gennemløber listen af produkter ved hjælp af reduce(), hvor 0 er startværdien, (sum, product) -> sum + product.getName().length() definerer logikken for opsummering af længderneproduktnavne, og Integer::sum kombinerer resultaterne i et parallelt behandlingsmiljø.

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

2. Hvornår bør du bruge 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

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

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 6
some-alt