Бесконечная последовательность натуральных чисел с генератором 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
.