Какой самый простой способ изменить тип внутреннего значения во вложенной карте в java? - PullRequest
4 голосов
/ 15 апреля 2020

Мне передана вложенная карта Map<String, Map<String, List<ObjectA>>>, и я хочу изменить ее на тип Map<String, Map<String, Set<ObjectA>>>. Какой самый простой способ сделать это в Java с использованием потока? Я пытался использовать Collectors.groupingBy, но не могу заставить его работать.

1 Ответ

4 голосов
/ 15 апреля 2020

Лучший способ - перебирать каждую запись на внешней и внутренней карте, а затем преобразовывать значение записи внутренней карты List<ObjectA> в Set<ObjectA>

Map<String, Map<String, Set<ObjectA>>> resultMap = map.entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().entrySet().stream()
                    .collect(Collectors.toMap(Map.Entry::getKey, val -> new HashSet<>(val.getValue())))));

Примечание: Если вы конвертируете List в HashSet, вы не будете поддерживать тот же порядок, поэтому вы можете выбрать LinkedHashSet вместо HashSet для поддержания порядка

Map<String, Map<String, Set<ObjectA>>> resultMap = map.entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().entrySet().stream()
                    .collect(Collectors.toMap(Map.Entry::getKey, val -> new LinkedHashSet<>(val.getValue())))));
...