Группировка потоковых api-коллекторов по полям с нулевым счетом - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть объект с полем type1, который используется для создания первой группы, и у меня есть два поля, которые используются для создания второй группы. Но вторая группа всегда получает одно из этих трех значений (X, Y, Z). На данный момент я написал код, подобный этому:

Map<String, Map<String, Long>> result = objList.stream()
            .collect(Collectors.groupingBy(Obj::type1,
                     Collectors.groupingBy(Obj::useTwoFieldToGetSecondGroup, Collectors.counting())))

В результате этого кода я получаю это:

{
  "A":{
     "Y":5,
     "Z":3
  },
  "B":{
     "Y":2,
     "Z":1
  },
  "C":{
     "X":2
  },
  "D":{
     "X":6,
     "Z":2
  }

}

Но я знаю, что второй тип имеет всегда три типа значений, и я хочу видеть что-то вроде этого:

{
  "A":{
     "X":0,
     "Y":5,
     "Z":3
  },
  "B":{
     "X":0,
     "Y":2,
     "Z":1
  },
  "C":{
     "X":2,
     "Y":0,
     "Z":0
  },
  "D":{
     "X":6,
     "Y":0,
     "Z":2
  }

}

Есть ли какой-либо способ получить этот результат легко?

public classObj {

   private String type1; //key of first map

   private String field1; //second key calculated with this two fields
   private String field2;

   public String useTwoFieldToGetSecondGroup(){
       //use field1 and field2 to get X or Y or Z
   }

}

и Метод useTwoFieldToGetSecondGroup, подобный следующему:

...