Aggregieren von Elementen mit der Reduce()-Methode
Beim Arbeiten mit Collections in Java besteht häufig die Notwendigkeit, alle Elemente auf ein einzelnes Ergebnis zu reduzieren, wie beispielsweise eine Summe, ein Produkt oder einen anderen aggregierten Wert.
Es gibt drei Varianten der reduce()-Methode, die jeweils für unterschiedliche Szenarien konzipiert sind. Im Folgenden werden alle Varianten detailliert erläutert.
reduce() mit einem einzelnen Parameter
Wenn eine Aggregation der Elemente ohne einen Anfangswert erforderlich ist, kann diese Variante von reduce() verwendet werden. Da der Stream jedoch leer sein könnte, gibt die Methode ein Optional<T> zurück.
Optional<T> reduce(BinaryOperator<T> accumulator);
Diese Methode wendet die Funktion accumulator auf alle Elemente im Stream an und gibt ein Optional<T> zurück.
Praktisches Beispiel
Angenommen, ein Online-Shop verfügt über eine Liste von Produkten und deren Preisen. Ziel ist es, den Gesamtumsatz aller Produkte im Shop zu berechnen.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738package 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; } }
Dieser Code erstellt eine Liste von Produkten und verwendet anschließend reduce(), um die Preise zu addieren. Die Methode map(Product::getPrice) extrahiert den Preis jedes Produkts, während Double::sum die Summierung durchführt. Falls das Ergebnis vorhanden ist, wird es ausgegeben.
reduce() mit zwei Parametern
Um einen garantierten Rückgabewert zu erhalten, selbst wenn der Stream leer ist, sollte die reduce()-Methode mit einem Identitätsparameter verwendet werden. Der Anfangswert gewährleistet eine stabile Berechnung.
T reduce(T identity, BinaryOperator<T> accumulator);
Diese Version von reduce() beginnt mit dem angegebenen identity-Wert und stellt sicher, dass immer ein Ergebnis zurückgegeben wird, selbst bei einem leeren Stream.
Praktisches Beispiel
Angenommen, ein Geschäft verfügt über eine Kasse mit einem Anfangssaldo, und es soll der Gesamtpreis aller Produkte addiert werden, um den möglichen Gesamtkassenbestand zu ermitteln.
Main.java
12345678910111213141516171819202122232425262728293031323334353637package 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; } }
Hier extrahiert der Code die Preise mit map(Product::getPrice) und wendet reduce(500.0, Double::sum) an, wobei 500.0 das Anfangsguthaben darstellt und Double::sum die Werte aufsummiert.
reduce() für parallele Verarbeitung
Diese Version von reduce() ist für Fälle konzipiert, in denen komplexere Transformationen erforderlich sind und Ergebnisse parallel aggregiert werden müssen.
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
Diese Methode nimmt drei Parameter entgegen:
identity– der Anfangswert;accumulator– eine Funktion, die jedes Element transformiert;combiner– eine Funktion, die Teilergebnisse zusammenführt.
Praktisches Beispiel
In einem Online-Shop muss die Gesamtanzahl der Zeichen in allen Produktnamen berechnet werden. Dies kann nützlich sein, um Grenzwerte für die Beleglänge festzulegen.
Main.java
123456789101112131415161718192021222324252627282930313233343536package 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; } }
Der Code durchläuft die Liste der Produkte mit reduce(), wobei 0 als Anfangswert dient, (sum, product) -> sum + product.getName().length() die Logik zum Addieren der Längen der Produktnamen definiert und Integer::sum die Ergebnisse in einer Parallelverarbeitung zusammenführt.
1. Welchen Datentyp gibt reduce(BinaryOperator<T> accumulator) zurück, wenn der Stream leer sein könnte?
2. Wann sollte reduce(T identity, BinaryOperator<T> accumulator) verwendet werden?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 2.33
Aggregieren von Elementen mit der Reduce()-Methode
Swipe um das Menü anzuzeigen
Beim Arbeiten mit Collections in Java besteht häufig die Notwendigkeit, alle Elemente auf ein einzelnes Ergebnis zu reduzieren, wie beispielsweise eine Summe, ein Produkt oder einen anderen aggregierten Wert.
Es gibt drei Varianten der reduce()-Methode, die jeweils für unterschiedliche Szenarien konzipiert sind. Im Folgenden werden alle Varianten detailliert erläutert.
reduce() mit einem einzelnen Parameter
Wenn eine Aggregation der Elemente ohne einen Anfangswert erforderlich ist, kann diese Variante von reduce() verwendet werden. Da der Stream jedoch leer sein könnte, gibt die Methode ein Optional<T> zurück.
Optional<T> reduce(BinaryOperator<T> accumulator);
Diese Methode wendet die Funktion accumulator auf alle Elemente im Stream an und gibt ein Optional<T> zurück.
Praktisches Beispiel
Angenommen, ein Online-Shop verfügt über eine Liste von Produkten und deren Preisen. Ziel ist es, den Gesamtumsatz aller Produkte im Shop zu berechnen.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738package 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; } }
Dieser Code erstellt eine Liste von Produkten und verwendet anschließend reduce(), um die Preise zu addieren. Die Methode map(Product::getPrice) extrahiert den Preis jedes Produkts, während Double::sum die Summierung durchführt. Falls das Ergebnis vorhanden ist, wird es ausgegeben.
reduce() mit zwei Parametern
Um einen garantierten Rückgabewert zu erhalten, selbst wenn der Stream leer ist, sollte die reduce()-Methode mit einem Identitätsparameter verwendet werden. Der Anfangswert gewährleistet eine stabile Berechnung.
T reduce(T identity, BinaryOperator<T> accumulator);
Diese Version von reduce() beginnt mit dem angegebenen identity-Wert und stellt sicher, dass immer ein Ergebnis zurückgegeben wird, selbst bei einem leeren Stream.
Praktisches Beispiel
Angenommen, ein Geschäft verfügt über eine Kasse mit einem Anfangssaldo, und es soll der Gesamtpreis aller Produkte addiert werden, um den möglichen Gesamtkassenbestand zu ermitteln.
Main.java
12345678910111213141516171819202122232425262728293031323334353637package 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; } }
Hier extrahiert der Code die Preise mit map(Product::getPrice) und wendet reduce(500.0, Double::sum) an, wobei 500.0 das Anfangsguthaben darstellt und Double::sum die Werte aufsummiert.
reduce() für parallele Verarbeitung
Diese Version von reduce() ist für Fälle konzipiert, in denen komplexere Transformationen erforderlich sind und Ergebnisse parallel aggregiert werden müssen.
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
Diese Methode nimmt drei Parameter entgegen:
identity– der Anfangswert;accumulator– eine Funktion, die jedes Element transformiert;combiner– eine Funktion, die Teilergebnisse zusammenführt.
Praktisches Beispiel
In einem Online-Shop muss die Gesamtanzahl der Zeichen in allen Produktnamen berechnet werden. Dies kann nützlich sein, um Grenzwerte für die Beleglänge festzulegen.
Main.java
123456789101112131415161718192021222324252627282930313233343536package 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; } }
Der Code durchläuft die Liste der Produkte mit reduce(), wobei 0 als Anfangswert dient, (sum, product) -> sum + product.getName().length() die Logik zum Addieren der Längen der Produktnamen definiert und Integer::sum die Ergebnisse in einer Parallelverarbeitung zusammenführt.
1. Welchen Datentyp gibt reduce(BinaryOperator<T> accumulator) zurück, wenn der Stream leer sein könnte?
2. Wann sollte reduce(T identity, BinaryOperator<T> accumulator) verwendet werden?
Danke für Ihr Feedback!