我正在测试新的 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/