← SEARCHABLE ARCHIVE
Java · 2026-08-03

Java von den Grundlagen bis zum Profi — Folge 6

Erstellen von Datenflüssen mit Lambda, Stream und Optional

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

Code, der Werte auswählt, konvertiert und kombiniert, die Bedingungen in einer Sammlung erfüllen, erscheint häufig. Lambda und Stream drücken die Phasen aus, die Daten durch einen Operationsfluss durchlaufen.

Lambda

Predicate<Monster> isAlive = monster -> monster.getHealth() > 0;
Function<Monster, String> getName = Monster::getName;

Lambdas ermöglichen die Übergabe von Aktionen als Werte. Methodenreferenzen sind prägnant, wenn eine vorhandene Methode in derselben Funktionsform verwendet wird.

Stream-Pipeline

List<String> targetNames = monsters.stream()
    .filter(Monster::isAlive)
    .sorted(Comparator.comparingInt(Monster::getHealth))
    .limit(3)
    .map(Monster::getName)
    .toList();

Der Ablauf besteht darin, lebende Monster nach ihrer körperlichen Stärke zu sortieren und drei Namen zu erhalten. Zwischenoperationen werden normalerweise ausgeführt, wenn die letzte Operation aufgerufen wird.

Sobald ein Stream verbraucht ist, kann derselbe Stream nicht erneut verwendet werden. Sie müssen die ursprüngliche Sammlung wiederholt abfragen oder die Ergebnisse als Liste speichern.

Optional

Optional<Item> item = repository.find(10);

String name = item
    .map(Item::getName)
    .orElse("Unknown");

Optional gibt dem Rückgabetyp an, dass der Wert vorhanden sein kann oder nicht. Wenn Sie get() direkt aufrufen, geht keine Verarbeitung mehr verloren. Verwenden Sie daher Operationen wie orElse, map und ifPresent.

Optional wird häufig verwendet, um das Fehlen eines Rückgabewerts auszudrücken, anstatt ihn für alle Felder und Parameter zu verwenden.

Leistung und Lesbarkeit

Streams sind nicht immer schneller als Schleifen und können zu kleinen Operationsobjekten und Ergebnislisten führen. Es ist besser, mit einem leicht lesbaren Ablauf zu beginnen und dann nur die sich wiederholenden Pfade, die bei tatsächlichen Messungen zu Problemen führen, in einfache Schleifen umzuwandeln.

Der Zweck von Lambdas und Streams besteht nicht darin, den Code so kurz wie möglich zu halten. Ziel ist es, Datenverarbeitungsschritte wie Filterung, Transformation und Sortierung ohne Nebenwirkungen lesbar zu machen.