如何使用Java 8创建无限流

snd*_*yuk 67 java java-8

有没有一种简单的方法可以使用没有外部库的创建无限流?

例如在Scala中:

Iterator.iterate(0)(_ + 2)
Run Code Online (Sandbox Code Playgroud)

ski*_*iwi 99

是的,有一个简单的方法:

IntStream.iterate(0, i -> i + 2);
Run Code Online (Sandbox Code Playgroud)

作为用例:

IntStream.iterate(0, i -> i + 2)
         .limit(100)
         .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

其中打印出0到198,步长为2.

通用方法是:

Stream.iterate(T seed, UnaryOperator<T> f);
Run Code Online (Sandbox Code Playgroud)

后者在使用中可能更为罕见.

  • +1,但值得一提的是,当IntStream.iterate不适合时,可以使用`IntStream.generate`,例如Fibonacci序列. (16认同)

Jes*_*per 7

这是一个例子:

PrimitiveIterator.OfInt it = new PrimitiveIterator.OfInt() {
    private int value = 0;

    @Override
    public int nextInt() {
        return value++;
    }

    @Override
    public boolean hasNext() {
        return true;
    }
};

Spliterator.OfInt spliterator = Spliterators.spliteratorUnknownSize(it,
    Spliterator.DISTINCT | Spliterator.IMMUTABLE |
    Spliterator.ORDERED | Spliterator.SORTED);

IntStream stream = StreamSupport.intStream(spliterator, false);
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,它有点冗长.要打印此流的前10个元素:

stream.limit(10).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

您可以像在Scala示例中那样转换元素:

IntStream plusTwoStream = stream.map(n -> n + 2);
Run Code Online (Sandbox Code Playgroud)

请注意,有内置的无限流,例如,java.util.Random.ints()它为您提供无限的随机整数流.

  • 鉴于你的'PrimitiveIterator.OfInt it`,一个简单的`IntStream.generate(it :: next)`也可以.所以它甚至根本不必是迭代器,例如`IntStream.generate(new AtomicInteger():: incrementAndGet)`也将提供这样一个自然数字序列. (2认同)