2017-07-19 41 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