2017-07-19 60 views
4

讓我們說我們有一個對象抽獎:的Java 8 groupingBy列表

class Draw { 

private int num1, num2, num3; 

public Draw (int num1, int num2, int num3) { 
    this.num1 = num1; 
    this.num2 = num2; 
    this.num3 = num3; 
} 

public int getNum1() { 
    return num1; 
} 

public void setNum1(int num1) { 
    this.num1 = num1; 
} 

public int getNum2() { 
    return num2; 
} 

public void setNum2(int num2) { 
    this.num2 = num2; 
} 

public int getNum3() { 
    return num3; 
} 

public void setNum3(int num3) { 
    this.num3 = num3; 
} 

public List<Integer> getResultAsList() { 
    return Arrays.asList(num1, num2, num3); 
} 

}

現在,有繪製的名單,我需要一個地圖,其中關鍵是在畫一些與值是一個計數(這個數字是多少次繪製)

例如,具有

List<Draw> drawList = Arrays.asList(new Draw(1,2,5), new Draw(1,5,6)); 

我希望得到一個地圖l ike如下:{1 = 2,2 = 1,5 = 2,6 = 1}

我可以使用java 8的新分組操作或其他新功能來實現此操作嗎?

謝謝。

回答

2

如果我得到的一切權利:

Map<Integer, Long> map = drawList 
     .stream() 
     .flatMap(x -> Stream.of(x.getNum1(), x.getNum2(), x.getNum3())) 
     .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 

System.out.println(map); // {1=2, 2=1, 5=2, 6=1} 

或者明明是這樣的:

Map<Integer, Long> map2 = drawList 
      .stream() 
      .flatMap(x -> x.getResultAsList().stream()) 
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 
+0

感謝Eugenre。代碼不可編譯。我得到「不能推斷類型參數爲 flatMap(功能<?超T ,?延伸流>)」 – EasyRider

+1

@ user1712442這很有趣,它編譯對我來說很好用'javac' – Eugene

+0

我使用Eclipse霓虹燈。但我發現做它的方式編譯:{地圖<爲Integer,Long>地圖= drawList \t \t \t .stream() \t \t \t .flatMap(X - > x.getResultAsList()流()。) \t \t \t .collect(Collectors.groupingBy(Function.identity(),Collectors.counting())); \t \t \t \t System.out.println(map);} – EasyRider