Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как создать последовательность чисел

Короткий ответ

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() — Создаёт бесконечный поток из значений функции-поставщика.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.