我想用随机数制作一个流。一旦数字满满一定条件,我想现在需要多少次迭代。所以要么我想要流的大小,要么我可以从中读取大小。
以下是我的方法:
random.ints(0, Integer.MAX_VALUE).anyMatch(a -> {return a < 20000;});
一旦满足条件,这只给我一个布尔值。
random.ints(0, Integer.MAX_VALUE).filter(a -> a < 20000).limit(1).count();
这显然会返回1.但我希望在过滤结果之前有大小。我用计数变量进一步尝试了几个东西,但由于lambdas从外部有效地捕获它们,我有一个初始化问题。
任何帮助或提示表示赞赏
Java 9有一个支持它的功能 - takeWhile:
random.ints(0, Integer.MAX_VALUE).takeWhile(a -> a < 20000).count();
你可以尝试takeWhile
项目的this
示例:
IntStream intStream = new Random().ints();
Stream<Integer> result = StreamUtils.takeWhile(intStream.boxed().peek(i->System.out.println("in stream : " + i)), i -> i > 2000);
long count = result.peek(i->System.out.println("in result : " + i))
.count();
System.out.println(count);
打印:
in stream : 1466689339
in result : 1466689339
in stream : 1588320574
in result : 1588320574
in stream : 1621482181
in result : 1621482181
in stream : -2140739741
3
Java 8中没有Stream.takeWhile()
,但您可以使用iterator()
轻松解决此问题:
public static int countWhile(IntStream stream, IntPredicate predicate) {
PrimitiveIterator.OfInt iterator = stream.iterator();
int i = 0;
while (predicate.test(iterator.nextInt())) {
i++;
}
return i;
}