Как создать последовательность чисел
Короткий ответ
IntStream.range(a, b) даёт числа от a до b не включительно, rangeClosed() — включительно:
void main() {
IO.println(IntStream.range(1, 5).boxed().toList());
IO.println(IntStream.rangeClosed(1, 5).boxed().toList());
}Результат:
[1, 2, 3, 4]
[1, 2, 3, 4, 5]С шагом
iterate() с условием работает как цикл for:
void main() {
IO.println(IntStream.iterate(0, n -> n <= 20, n -> n + 5).boxed().toList());
IO.println(IntStream.iterate(10, n -> n > 0, n -> n - 3).boxed().toList());
}Результат:
[0, 5, 10, 15, 20]
[10, 7, 4, 1]Вместо цикла
Диапазон часто заменяет цикл со счётчиком:
void main() {
int sumOfSquares = IntStream.rangeClosed(1, 10).map(n -> n * n).sum();
IO.println(sumOfSquares);
}Результат:
385Бесконечный поток
iterate() без условия и generate() бесконечны — ограничьте их через limit():
void main() {
IO.println(Stream.iterate(1, n -> n * 2).limit(8).toList());
IO.println(Stream.generate(() -> "ab").limit(3).collect(Collectors.joining()));
}Результат:
[1, 2, 4, 8, 16, 32, 64, 128]
abababЧастая ошибка
Забыть boxed() перед toList(). У IntStream нет метода toList(), потому что список не может хранить int:
void main() {
var numbers = IntStream.range(0, 3).toList();
}Результат:
Main.java:2: error: cannot find symbolФункции из этого ответа
- IntStream.range() — Создаёт поток целых чисел из диапазона.
- Stream.iterate() — Создаёт поток, где каждый элемент вычисляется из предыдущего.
- Stream.generate() — Создаёт бесконечный поток из значений функции-поставщика.