如何使用 Java 8 创建无限流
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22483554/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to create an infinite stream with Java 8
提问by sndyuk
采纳答案by skiwi
Yes, there is an easyway:
是的,有一个简单的方法:
IntStream.iterate(0, i -> i + 2);
With as usecase:
作为用例:
IntStream.iterate(0, i -> i + 2)
.limit(100)
.forEach(System.out::println);
Which prints out 0 to 198 increasing in steps of 2.
它打印出 0 到 198,以 2 的步长递增。
The generic method is:
通用方法是:
Stream.iterate(T seed, UnaryOperator<T> f);
The latter may be more uncommon in usage.
后者在使用中可能更不常见。
回答by Jesper
Here is an example:
下面是一个例子:
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);
It's a bit verbose, as you see. To print the first 10 elements of this stream:
如您所见,这有点冗长。要打印此流的前 10 个元素:
stream.limit(10).forEach(System.out::println);
You can ofcourse also transform the elements, like you do in your Scala example:
您当然也可以转换元素,就像您在 Scala 示例中所做的那样:
IntStream plusTwoStream = stream.map(n -> n + 2);
Note that there are built-in infinite streams such as java.util.Random.ints()
which gives you an infinite stream of random integers.
请注意,有内置的无限流,例如java.util.Random.ints()
它为您提供无限的随机整数流。
回答by Bassem Reda Zohdy
You can build your own InfiniteStream by implementing stream and consumer and compose both and may will need queue to queueing your data as :
您可以通过实现流和消费者来构建自己的 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
}
check full code here https://gist.github.com/bassemZohdy/e5fdd56de44cea3cd8ff
在此处查看完整代码 https://gist.github.com/bassemZohdy/e5fdd56de44cea3cd8ff
回答by Oleksandr Pyrohov
There is another possible solution in Java 8:
Java 8 中有另一种可能的解决方案:
AtomicInteger adder = new AtomicInteger();
IntStream stream = IntStream.generate(() -> adder.getAndAdd(2));
Important: an order of numbers is preserved only if the stream is sequential.
重要提示:仅当流是顺序的时才会保留数字顺序。
It's also worth noting that a new version of the IntStream.iterate
has been added since Java 9:
还值得注意的是,IntStream.iterate
自Java 9以来已添加了新版本:
static IntStream iterate?(int seed,
IntPredicate hasNext,
IntUnaryOperator next);
- seed -the initial element;
- hasNext -a predicate to apply to elements to determine when the stream must terminate;
- next -a function to be applied to the previous element to produce a new element.
- 种子 -初始元素;
- hasNext -应用于元素以确定流何时必须终止的谓词;
- next -应用于前一个元素以生成新元素的函数。
Examples:
例子:
IntStream stream = IntStream.iterate(0, i -> i >= 0, i -> i + 2);
IntStream.iterate(0, i -> i < 10, i -> i + 2).forEach(System.out::println);