Java 8 группировкаПо списку списка

Допустим, у нас есть объект Draw:

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));

Я хочу получить карту следующего вида: {1=2, 2=1, 5=2, 6=1}

Могу ли я реализовать это с помощью новых операций группировки по java 8 или другой новой функции?

Спасибо.


person EasyRider    schedule 19.07.2017    source источник


Ответы (1)


Если я все правильно понял:

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()));
person Eugene    schedule 19.07.2017
comment
Спасибо Евгений. Код не компилируется. Я получаю Невозможно вывести аргумент(ы) типа для ‹R› flatMap(Function‹? super T,? extends Stream‹? extends R››) - person EasyRider; 19.07.2017
comment
@user1712442 user1712442 это интересно, у меня он отлично компилируется с javac - person Eugene; 19.07.2017
comment
Я использую Eclipse Neon. Но я нашел способ сделать его компилируемым: {Map‹Integer, Long› map = drawList .stream() .flatMap(x -> x.getResultAsList().stream()) .collect(Collectors.groupingBy(Function.identity (), Collectors.counting())); System.out.println(карта);} - person EasyRider; 19.07.2017
comment
Спасибо Евгений еще раз. ))) - person EasyRider; 19.07.2017