[英]How to create an infinite stream with Java 8
是的,有一個簡單的方法:
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);
如您所見,這有點冗長。 要打印此流的前 10 個元素:
stream.limit(10).forEach(System.out::println);
您當然也可以轉換元素,就像您在 Scala 示例中所做的那樣:
IntStream plusTwoStream = stream.map(n -> n + 2);
請注意,有內置的無限流,例如java.util.Random.ints()
,它為您提供無限的隨機整數流。
Java 8 中有另一種可能的解決方案:
AtomicInteger adder = new AtomicInteger();
IntStream stream = IntStream.generate(() -> adder.getAndAdd(2));
重要提示:僅當流是順序的時才會保留數字順序。
還值得注意的是,自Java 9以來添加了新版本的IntStream.iterate
:
static IntStream iterate(int seed,
IntPredicate hasNext,
IntUnaryOperator next);
例子:
IntStream stream = IntStream.iterate(0, i -> i >= 0, i -> i + 2);
IntStream.iterate(0, i -> i < 10, i -> i + 2).forEach(System.out::println);
您可以通過實現流和消費者來構建自己的 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.