有没有一种简单的方法可以使用创建无限流 Java-8 没有外部库?
例如在Scala中:
Iterator.iterate(0)(_ + 2)
Answers:
是的,有一个简单的方法:
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);
后者的用法可能更不常见。
IntStream.iterate
不适合Fibnoacci
?
IntStream.iterate
?
这是一个例子:
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()
它为您提供了无限的随机整数流。
PrimitiveIterator.OfInt it
,一个简单的方法IntStream.generate(it::next)
也可以。因此,它甚至根本不必是迭代器,例如IntStream.generate(new AtomicInteger()::incrementAndGet)
也将提供这种自然的数字序列。
java.util.Random.ints()
,+ 1
Java 8中还有另一种可能的解决方案:
AtomicInteger adder = new AtomicInteger();
IntStream stream = IntStream.generate(() -> adder.getAndAdd(2));
重要:仅当流是连续的时,数字顺序才被保留。
还值得注意的是,IntStream.iterate
自Java 9以来已添加了的新版本:
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
IntStream.generate
可以在IntStream.iterate
不适合时使用,例如斐波那契数列。