Iteration obliegt dem Container. Ein interner Iterator ist zusammensetzbar. List<Integer> prices = Arrays.asList(10, 20, 30, 40, 50); return prices.stream() .sum(); List<Integer> prices = Arrays.asList(10, 20, 30, 40, 50); return prices.stream() .mapToDouble(price -> price * 0.9) .sum(); List<Integer> prices = Arrays.asList(10, 20, 30, 40, 50); return prices.stream() .filter(price -> price >= 40) .mapToDouble(price -> price * 0.9) .sum(); List<Integer> prices = Arrays.asList(10, 20, 30, 40, 50); return prices.stream() .filter(price -> price >= 40) .mapToDouble(price -> price * 0.9) .sum(); Eigenschaften Lambda-Funktion kodiert Verhalten … … wird an generische Methode des Containers übergeben Container entscheidet, ob sequentiell oder parallel und / oder lazy Dekomposition in einzelne, funktionale Aspekte Schritt 1, Schritt 2, …, Schritt k „Fluss“ ist sofort erkennbar