Stream.iterate() с предикатом
Использование предиката для завершения итерации — как цикл 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
Сложность
Средний
Поддержка JDK
Stream.iterate() с предикатом
Доступно
Широко доступно с JDK 9 (сент. 2017)
Как это работает
Трёхаргументный Stream.iterate(seed, hasNext, next) работает как цикл for: seed — начальное значение, hasNext определяет остановку, next генерирует следующее значение.
Связанная документация
Доказательство