簡體   English   中英

從Stream獲取兩個不同的輸出

[英]Getting two different outputs from a Stream

我正在測試java-8中的新Stream API ,並想檢查10000隨機coinflips的結果。 到目前為止,我有:

    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} 

雖然所有其他答案都是正確的,但它們的制定有點麻煩。

Map<Integer, Long> ,將翻轉的硬幣映射到計數。

Map<Integer, Long> coinCount = new Random().ints(10000, 0, 2)
        .boxed()
        .collect(Collectors.groupingBy(i -> i, Collectors.counting()));

這將首先創建IntStream ,然后將它們IntStream Stream<Integer> ,因為在本例中無論如何都要將它們存儲在盒裝版本中。 最后用身份i -> i上的groupingBy函數收集它們,它給你一個Map<Integer, List<Integer>> ,這不是你想要的,因此你用操作Collectors.counting()替換List<Integer> Collectors.counting()對它進行Collectors.counting() ,使得List<Integer>變為Long ,從而產生Map<Integer, Long>

如果要獲得兩個輸出,可以在一次迭代中收集多個結果。 在您的情況下,它可能看起來如下:

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

int[] counts = randomStream.collect(
    () -> new int[] { 0, 0 }, // supplier
    (a, v) -> a[v]++, // accumulator
    (l, r) -> { l[0] += r[0]; l[1] += r[1]; }); // combiner

System.out.println("Heads: " + counts[0]);
System.out.println("Tails: " + counts[1]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM