如何用Java 8创build无限stream

有没有一种简单的方法来创build一个无限的stream使用java-8没有外部库?

例如在Scala中:

Iterator.iterate(0)(_ + 2) 

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

 IntStream.iterate(0, i -> i + 2); 

用作用例:

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

打印出0至198,以2为单位递增。

通用的方法是:

 Stream.iterate(T seed, UnaryOperator<T> f); 

后者在使用中可能更不常见。

这里是一个例子:

 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); 

如你所见,这有点冗长。 要打印此stream的前10个元素,请执行以下操作:

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

你也可以改变元素,就像你在Scala例子中做的那样:

 IntStream plusTwoStream = stream.map(n -> n + 2); 

请注意,有内置的无限stream,如java.util.Random.ints() ,它给你一个无限的随机整数stream。

你可以通过实现stream和消费者来构build你自己的InfiniteStream,并且可能需要队列来排队你的数据:

 public class InfiniteStream<T> implements Consumer<T>, Stream<T> { private final Stream<T> stream; private final Queueing q; ... public InfiniteStream(int length) { this.q = new Queueing(this.length); this.stream = Stream.generate(q); ... } //implement stream methods //implement accept } 

在这里查看完整的代码https://gist.github.com/bassemZohdy/e5fdd56de44cea3cd8ff