Streams Средний

Использование предиката для завершения итерации — как цикл for в виде Stream.

✕ Java 8
Stream.iterate(1, n -> n * 2)
    .limit(10)
    .forEach(System.out::println);
// can't stop at a condition
✓ Java 9+
Stream.iterate(
    1,
    n -> n < 1000,
    n -> n * 2
).forEach(IO::println);
// stops when n >= 1000
Заметили проблему в этом коде? Сообщите нам.
🎯

Естественная остановка

Остановка по условию, а не по произвольному ограничению.

📐

Эквивалент цикла for

Та же семантика, что у for(seed; hasNext; next).

🛡️

Нет риска бесконечного Stream

Предикат гарантирует завершение.

Старый подход
iterate + limit
Современный подход
iterate(seed, pred, op)
Начиная с JDK
9
Сложность
Средний
Stream.iterate() с предикатом
Доступно

Широко доступно с JDK 9 (сент. 2017)

Трёхаргументный Stream.iterate(seed, hasNext, next) работает как цикл for: seed — начальное значение, hasNext определяет остановку, next генерирует следующее значение.