Отделяйте каждую карту в списке карт - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть карта как: Map<Integer, Map<LocalDate, CustomObject>> Я хочу выполнить операции с каждым значением внутренней карты.Пример примера моих данных на карте:

<1, Map<2018-12-01, "A">
       <2018-12-02, "A">
       <2018-12-03, "A">
       <2018-12-04, "A">
       <2018-12-05, "A">>

<2, Map<2018-12-01, "B">
       <2018-12-02, "B">
       <2018-12-03, "B">
       <2018-12-04, "B">
       <2018-12-05, "B">>

<3, Map<2018-12-01, "C">
       <2018-12-02, "C">
       <2018-12-03, "C">
       <2018-12-04, "C">
       <2018-12-05, "C">>

Я попытался добавить значения карты в виде списка карты;Например:

List<Map<LocalDate, CustomObject>>

Но я не могу выполнить операцию, которую хочу выполнить

Мне нужно добавить все элементы по ключам и сгенерировать результирующую карту.то есть;Мне нужно что-то вроде INTO RESULTANT MAP

2018-12-01 : A+B+C
2018-12-02 : A+B+C
2018-12-03 : A+B+C

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вы можете перебирать как внешние, так и внутренние карты и добавлять записи в новую мультикарту:

Map<LocalDate, List<CustomObject>> result = new LinkedHashMap<>();
yourMap.forEach((k1, v1) -> 
     v1.forEach((k2, v2) -> 
         result.computeIfAbsent(k2, k -> new ArrayList<>()).add(v2)));

При этом используется Map.computeIfAbsent для создания нового списка, если для ключа нет записи.Затем экземпляр CustomObject добавляется в список.Здесь k1 - это ключ внешней карты, v1 - это внутренняя карта, k2 - это LocalDate, а v2 - это CustomObject экземпляр.

0 голосов
/ 20 декабря 2018

Вы можете использовать flatMap для получения Stream записей всех внутренних карт, а затем собирать их по своему желанию:

Map<Integer, Map<LocalDate, CustomObject>> input = ...

Map<LocalDate,List<CustomObject>> grouped =
    input.values() // Collection<Map<LocalDate, CustomObject>>
         .stream() // Stream<Map<LocalDate, CustomObject>>
         .flatMap(m -> m.entrySet().stream()) // Stream<Map.Entry<LocalDate, CustomObject>>
         .collect(Collectors.groupingBy(Map.Entry::getKey,
                                        Collectors.mapping(Map.Entry::getValue,
                                                           Collectors.toList())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...