如果我用依赖于输入的谓词限制它,我可以计算我的流大小吗?

问题描述 投票:5回答:3

我想用随机数制作一个流。一旦数字满满一定条件,我想现在需要多少次迭代。所以要么我想要流的大小,要么我可以从中读取大小。

以下是我的方法:

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 java-8 functional-programming java-stream
3个回答
3
投票

Java 9有一个支持它的功能 - takeWhile

random.ints(0, Integer.MAX_VALUE).takeWhile(a -> a < 20000).count();

0
投票

你可以尝试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

0
投票

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.