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

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

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

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

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

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

что было бы самым простым способом? Спасибо.

3 ответов


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


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

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

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

IntStream natural = IntStream.generate(generator);

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

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

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

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

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


построен в IntStream:

IntStream.range(0, Integer.MAX_VALUE)

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