java - 从流中获取两个不同的输出

标签 java java-8 java-stream

我正在测试新的 Stream API在 java-8 中,想要检查 10000 次随机掷硬币的结果。到目前为止,我有:

    public static void main(String[] args) {

        Random r = new Random();
        IntStream randomStream = r.ints(10000,0, 2);

        System.out.println("Heads: " + randomStream.filter(x -> x==1).count());
        System.out.println("Tails: " + randomStream.filter(x -> x==0).count());
    }

但这会抛出异常:

 java.lang.IllegalStateException: stream has already been operated upon or closed

我明白为什么会这样,但如果我只能使用一次流,我该如何打印正面和反面的计数?

最佳答案

第一个解决方案依赖于这样一个事实,即计算 10 000 次抛硬币的正面和反面的数量遵循二项式定律。

对于这个特定的用例,您可以使用 summaryStatistics方法。

Random r = new Random();
IntStream randomStream = r.ints(10000,0, 2);
IntSummaryStatistics stats =  randomStream.summaryStatistics();
System.out.println("Heads: "+ stats.getSum());
System.out.println("Tails: "+(stats.getCount()-stats.getSum()));


否则你可以使用 collect创建一个映射的操作,该映射将每个可能的结果与其在流中出现的次数进行映射。

Map<Integer, Integer> map = randomStream
                            .collect(HashMap::new, 
                                     (m, key) -> m.merge(key, 1, Integer::sum), 
                                     Map::putAll);
System.out.println(map); //{0=4976, 1=5024}

最后一个解决方案的优点是它适用于您为要生成的随机整数指定的任何界限。

例子:

IntStream randomStream = r.ints(10000,0, 5);
....
map => {0=1991, 1=1961, 2=2048, 3=1985, 4=2015}

关于java - 从流中获取两个不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23699178/

相关文章:

java - 如何从 Java 8 中的流中收集两个总和

java - ClassNotFoundException 打击 XMPPConnection

java - Servlet 在 Eclipse IDE 中不显示空白页

java - Completable Future什么时候将线程释放回线程池?

Java Lambda : How it works in JVM & is it OOP?

java-8 - Jahia 7 与 Oracle JDK 8 兼容吗

junit - Java GC 开销限制错误使用 JUnit 5 TestFactory 和大量的 dynamicTest (DynamicContainer/DynamicNode)

java - 我如何使用 flatMap 实现此目的

java - 如何更改 JMenuBar 中 JMenus 的方向

java - fragment 中的 Recyclerview。 Activity 关闭后不更新