Бесконечная последовательность натуральных чисел с генератором Java8

Я определил natural для бесконечной последовательности (Stream) натуральных чисел с помощью Java8 iterator.

IntStream natural = IntStream.iterate(0, i -> i + 1);

natural
 .limit(10)
 .forEach(System.out::println);

Теперь я хочу определить его с помощью Java8 generator.

статический поток генерации (Поставщик)

Каким будет самый простой способ? Спасибо.

Ответы

Ответ 1

Примечание. @assylias удалось сделать это с помощью лямбда, используя AtomicInteger. Вероятно, он должен принять принятый ответ.


Я не уверен, что вы можете сделать это с помощью лямбда (потому что это состояние), но с простым Supplier это будет работать:

IntSupplier generator = new IntSupplier() {
    int current = 0;

    public int getAsInt() {
        return current++;
    }
};

IntStream natural = IntStream.generate(generator);

Однако я предпочитаю ваше текущее решение, потому что это цель iterate(int seed, IntUnaryOperator f) IMHO:

IntStream natural = IntStream.iterate(0, i -> i + 1);

Ответ 2

С генератором вам нужно отслеживать свой текущий индекс. Один из способов:

IntStream natural = IntStream.generate(new AtomicInteger()::getAndIncrement);

Примечание. Я использую AtomicInteger как изменяемое целое число, а не его безопасность потока: если вы будете параллелизировать поток, порядок будет не таким, как ожидалось.

Ответ 3

Это встроено в IntStream:

IntStream.range(0, Integer.MAX_VALUE)

Возвращает все значения до (но не включая) Integer.MAX_VALUE.