Как сгруппировать, а затем toMap потоков - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть список объектов, по которым я хочу сгруппировать по 2 столбцам, а затем использовать toMap для сбора всех значений.

Допустим, у меня есть Объект с 5 атрибутами.класса A (a, b, c, d, e) и список этих объектов, скажем, list.то, что я хотел достичь, это сгруппировать по a, b и создать карту с ключом как c и всеми объектами, включая него.

//Expected format of output map:
Map<a, Map<b, Map<c, List<A>> myMap = new HashMap<>();


myMap = list.stream().
.collect(Collectors.groupingBy(A::a,
     Collectors.groupingBy(A::b,
     Collectors.toMap(A::c, Collectors.toList()))); //-> Here i'm expecting the map's key will be C and values should be all the onces which are grouped by a & b.

1 Ответ

1 голос
/ 30 апреля 2019

Если я понимаю ваш вопрос, вы хотите сгруппировать все значения по a и b, а затем заполнить этот список как карту с ключом c.

Вы можете достичь этого, используя Collectors.collectingAndThen():

Map<String, Map<String, Map<String, List<MyObject>>>> myMap = list.stream()
        .collect(Collectors.groupingBy(MyObject::getA,
                Collectors.groupingBy(MyObject::getB,
                        Collectors.collectingAndThen(Collectors.toList(),
                                l -> l.stream().collect(Collectors.toMap(MyObject::getC, x -> l))
                        ))));

Использование этого списка:

[
  {"a": "aaa", "b": "bbb", "c": "ccc", "d": "ddd", "e": "eee"},
  {"a": "aaa", "b": "bb",  "c": "cc",  "d": "ddd", "e": "ee" },
  {"a": "aa",  "b": "b",   "c": "ccc", "d": "d",   "e": "e"  },
  {"a": "aa",  "b": "b",   "c": "c",   "d": "dd",  "e": "ee" },
  {"a": "aaa", "b": "bb",  "c": "c",   "d": "dd",  "e": "eee"}
]

myMap будет выглядеть так:

{
  "aa": {
    "b": {
      "ccc": [
        {"a": "aa", "b": "b", "c": "ccc", "d": "d",   "e":  "e" },
        {"a": "aa", "b": "b", "c": "c",   "d" : "dd", "e" : "ee"}
      ],
      "c": [
        {"a": "aa", "b": "b", "c": "ccc", "d": "d",   "e":  "e" },
        {"a": "aa", "b": "b", "c": "c",   "d" : "dd", "e" : "ee"}
      ]
    }
  },
  "aaa": {
    "bb": {
      "cc": [
        {"a": "aaa", "b": "bb", "c": "cc", "d": "ddd", "e": "ee" }, 
        {"a": "aaa", "b": "bb", "c": "c",  "d": "dd",  "e": "eee"}
      ],
      "c": [
        {"a": "aaa", "b": "bb", "c": "cc", "d": "ddd", "e": "ee" }, 
        {"a": "aaa", "b": "bb", "c": "c",  "d": "dd",  "e": "eee"}
      ]
    },
    "bbb": {
      "ccc": [
        {"a": "aaa", "b": "bbb", "c": "ccc", "d": "ddd", "e": "eee"}
      ]
    }
  }
}
...