⚡ Lehrpfad 3: Generics, Collections & Modern Streams

Java 12: Lambdas, Streams API & Optional

Deklarative Datenanalyse in modernem Java: Filterung, Mappings, komplexe groupingBy-Aggregationen und Null-Safety mit Optional<T>.

📂 Dateien dieser Lerneinheit:
📄 Aufgabe.java (Startercode) 🧪 TestAufgabe.java (Tests) 💡 Musterloesung.java (Lösung) 📖 README.md

🌊 1. Die Anatomie einer Java Stream-Pipeline

Anstelle imperativer for-Schleifen mit temporären Variablen beschreiben Streams was getan werden soll, nicht wie es im Detail geschieht.

[List<Employee>] ──> .stream() ──> .filter(salary >= 75k) ──> .map(Employee::name) ──> .sorted() ──> .toList()
                                └── (Intermediäre Ops: Lazy) ──┘                    └── (Terminal: Eager) ──┘
// Modernes Idiom:
List<String> topPerformers = employees.stream()
    .filter(e -> e.salary() > 80000)
    .map(Employee::name)
    .sorted()
    .collect(Collectors.toList());

📊 2. Collectors & Null-Safety mit Optional

Mit Collectors.groupingBy aggregierst du Datensätze in Millisekunden nach Kategorien oder Abteilungen:

1. GroupingBy

Gruppiert Datensätze in eine Map<Key, List<T>>.

2. Downstream Collectors

Kombination mit averagingDouble oder counting().

3. Optional<T> Chaining

Sichere Null-Vermeidung mit map() und orElse().

🏢 Didaktische Analogie: Das automatisierte Fließband im Sortierzentrum

Stell dir ein Postfließband vor: Die Pakete gleiten am Scanner vorbei (filter entfernt zu schwere Pakete), werden automatisch umetikettiert (map) und fallen über Weichen direkt in die passenden Rollcontainer (Collectors.groupingBy) – ohne dass ein Mitarbeiter jedes Paket einzeln anfassen muss!

📑 3. Cheat-Sheet: Streams API & Optional Operationen

Operation Typ Beschreibung & Verhalten
.filter(Predicate<T>) Intermediär Behält nur Elemente, die das Prädikat erfüllen
.map(Function<T, R>) Intermediär Transformiert jedes Element in einen neuen Typ
.flatMap(Function<T, Stream<R>>) Intermediär Ebnet verschachtelte Streams/Listen in einen flachen Stream ein
.collect(Collectors.groupingBy(...)) Terminal Aggregiert Daten in eine Map<K, V>
Optional.map().orElse(...) Null-Safety Transformiert sicheren Wert oder liefert Standardwert

🧠 Diagnostischer Selbst-Check

Überprüfe dein Verständnis von Sprach-Features, Speicherverwaltung und Enterprise-Architektur, bevor du den Code in der Web-IDE schreibst.

🎯 Aufgaben & Checkliste in Aufgabe.java

💡 Performance Tipp: Method References

Nutze wann immer möglich Methodenreferenzen wie Employee::salary statt Lambdas wie e -> e.salary(). Das verbessert die Lesbarkeit und vermeidet anonyme Klasseninstanziierungen.

💻 In Web-IDE öffnen → Weiter zu Lehrpfad 4: Java 13 NIO.2 & JSON →