Java - Teeing Collectors
Hallo da, zukünftige Java-Zauberer! ? Heute werden wir auf eine aufregende Reise in die Welt der Java-Teeing-Collector einsteigen. Keine Sorge, wenn du neu in der Programmierung bist – ich werde dein freundlicher Guide sein, und wir gehen Schritt für Schritt vor. Am Ende dieses Tutorials wirst du erstaunt sein, was du mit Java alles machen kannst!
Was sind Teeing Collectors?
Bevor wir in die Tiefe einsteigen, beginnen wir mit den Grundlagen. Stell dir vor, du bist in einem edlen Restaurant und der Kellner bringt dir eine Teekanne mit zwei Schnüffeln. Das ist eine Art, was ein Teeing-Collector in Java ist – eine Möglichkeit, deine Daten gleichzeitig in zwei verschiedene "Tassen" (oder Operationen) zu gießen!
In Java-Begriffen ermöglicht ein Teeing-Collector es dir, zwei unabhängige Collector auf die gleiche Eingabe anzuwenden und dann ihre Ergebnisse zu kombinieren. Es ist wie zwei Helfer, die an der gleichen Aufgabe arbeiten, aber sich auf verschiedene Aspekte konzentrieren, und dann kombiniert du ihre Arbeit am Ende.
Die Methode Collectors.teeing()
Java hat die Collectors.teeing()
-Methode in Java 12 eingeführt. Sie ist Teil der Stream-API, einem leistungsfähigen Werkzeug zur Verarbeitung von Datenkollektionen. Lass uns ihre Syntax aufbrechen:
Syntax
public static <T,R1,R2,R> Collector<T,?,R> teeing(
Collector<? super T,?,R1> downstream1,
Collector<? super T,?,R2> downstream2,
BiFunction<? super R1,? super R2,R> merger)
Lass dich von dieser abschreckenden Syntax nicht beunruhigen! Lass uns sie aufbrechen:
-
T
: Der Typ der Eingabeelemente -
R1
: Der Ergebnistyp des ersten Collectors -
R2
: Der Ergebnistyp des zweiten Collectors -
R
: Der endgültige Ergebnistyp
Die Methode nimmt drei Parameter an:
-
downstream1
: Der erste Collector -
downstream2
: Der zweite Collector -
merger
: Eine Funktion zum Kombinieren der Ergebnisse der beiden Collector
Nun sieh dir das an, mit ein paar Beispielen!
Beispiel 1: Berechnung von Mittelwert und Anzahl
Stell dir vor, du bist ein Lehrer (genau wie ich!) und du möchtest sowohl den Durchschnittsnote deiner Schüler als auch die Anzahl der Schüler berechnen. So können wir das mit einem Teeing-Collector tun:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StudentScoreAnalyzer {
public static void main(String[] args) {
List<Integer> scores = Arrays.asList(85, 90, 78, 92, 88);
var result = scores.stream().collect(
Collectors.teeing(
Collectors.averagingInt(Integer::intValue),
Collectors.counting(),
(average, count) -> String.format("Durchschnitt: %.2f, Anzahl: %d", average, count)
)
);
System.out.println(result);
}
}
Lass uns das aufbrechen:
- Wir beginnen mit einer Liste von Schülernoten.
- Wir verwenden
scores.stream()
, um einen Stream dieser Noten zu erstellen. - Wir wenden
Collectors.teeing()
mit zwei Collector an:
-
Collectors.averagingInt(Integer::intValue)
berechnet den Durchschnittsnote. -
Collectors.counting()
zählt die Anzahl der Noten.
- Die Merger-Funktion kombiniert diese Ergebnisse in eine formatierte Zeichenkette.
Wenn du das ausführst, wirst du eine Ausgabe wie diese sehen:
Durchschnitt: 86.60, Anzahl: 5
Ist das nicht praktisch? Mit nur ein paar Zeilen Code haben wir zwei verschiedene Metriken unserer Daten berechnet!
Beispiel 2: Finden der niedrigsten und höchsten Noten
Jetzt sagen wir, du möchtest sowohl die niedrigste als auch die höchste Note in deiner Klasse finden. Wir können das mit einer einzigen Stream-Operation using einen Teeing-Collector tun:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StudentScoreAnalyzer {
public static void main(String[] args) {
List<Integer> scores = Arrays.asList(85, 90, 78, 92, 88);
var result = scores.stream().collect(
Collectors.teeing(
Collectors.minBy(Integer::compareTo),
Collectors.maxBy(Integer::compareTo),
(min, max) -> String.format("Niedrigste: %d, Höchste: %d", min.orElse(0), max.orElse(0))
)
);
System.out.println(result);
}
}
In diesem Beispiel:
- Wir verwenden die gleiche Liste von Noten.
- Unser erster Collector,
Collectors.minBy(Integer::compareTo)
, findet die niedrigste Note. - Unser zweiter Collector,
Collectors.maxBy(Integer::compareTo)
, findet die höchste Note. - Die Merger-Funktion kombiniert diese in eine formatierte Zeichenkette, verwendet
orElse(0)
, um den Fall zu handhaben, dass die Liste leer sein könnte.
Wenn du das ausführst, erhältst du:
Niedrigste: 78, Höchste: 92
Warum Teeing Collectors verwenden?
Du fragst dich vielleicht, "Warum all diese Mühe? Konnte man diese Operationen nicht einfach separat durchführen?" Natürlich könntest du! Aber Teeing-Collector bieten einige Vorteile:
- Effizienz: Du musst nur einmal durch die Daten iterieren, was bei großen Datensätzen zu einem großen Leistungssprung führen kann.
- Lesbarkeit: Es macht deinen Code kompakter und leichter zu verstehen.
- Flexibilität: Du kannst jeden zwei Collector auf kreative Weise kombinieren, um komplexe Probleme zu lösen.
Praktische Anwendungen
Teeing-Collector sind nicht nur für einfache Beispiele wie diese nützlich. Sie können in realen Welt-Szenarien unglaublich nützlich sein:
- In Finanzanwendungen könntest du sie verwenden, um sowohl den Gesamtbetrag als auch den Durchschnitt der Transaktionen in einem Durchgang zu berechnen.
- In der Datenanalyse könntest du sie verwenden, um gleichzeitig Median und Modus eines Datensatzes zu finden.
- In der Spielentwicklung könntest du sie verwenden, um sowohl die höchste Punktzahl als auch die Anzahl der Spieler zu verfolgen, die sie erreicht haben.
Schlussfolgerung
Und so haben wir es, Freunde! Wir haben eine tiefe Einblicke in die Welt der Java-Teeing-Collector genommen. Wir haben gesehen, wie sie uns helfen können, zwei Operationen gleichzeitig durchzuführen und die Ergebnisse zu kombinieren, alles in einer einzigen, effizienten Stream-Operation.
Denke daran, Programmierung ist alles darum zu gehen, Probleme zu lösen, und Teeing-Collector sind nur ein weiteres Werkzeug in deinem Problemloesungstoolkit. Je mehr du mit ihnen übst, desto kreativer wirst du finden, sie in deinen eigenen Projekten zu verwenden.
Fahre fort, zu coden, zu lernen und vor allem, hab Spaß dabei! Wer weiß? Vielleicht wirst du eines Tages Java lehren und deine eigenen Erfahrungen und schlechten Witze mit einer neuen Generation von Programmierern teilen. Bis zum nächsten Mal, happy coding! ?????
Credits: Image by storyset