Конвертировать Java Карта > к карте > - PullRequest
0 голосов
/ 15 февраля 2020

Что было бы хорошей практикой для преобразования Map<Obj1, Collection<Obj2>> в Map<Obj2, Collection<Obj1>>?

Я пытался сделать это с MultiMap.

    Map<Obj1, Collection<Obj2>> originalMap = ...;
    Multimap<Obj1, Obj2> multiMap = ArrayListMultimap.create();
    originalMap.forEach(multiMap::putAll);
    Map<Obj2, Collection<Obj1>> convertedMap = Multimaps.invertFrom(multiMap, ArrayListMultimap.create()).asMap();

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Вы можете добиться того же самого с Java 8 потоков;

Map<Obj1, List<Obj2>> originalMap = ...

Map<Obj2, List<Obj1>> reversedMap = originalMap.entrySet().stream()
        .flatMap(obj2s -> obj2s.getValue().stream()
                .map(obj2 -> Map.entry(obj2, obj2s.getKey())))
        .collect(
                Collectors.groupingBy(
                        Map.Entry::getKey, 
                        Collectors.mapping(Map.Entry::getValue, Collectors.toList())
                )
        );

fltMap охватывает Map<Obj1, List<Obj2>> в кортеж, подобный <Obj2, Obj1>, а затем собирать результаты группировки по Obj2.

0 голосов
/ 17 февраля 2020

Ваш подход верен, но может быть еще более простым, если вы вместо этого использовали Multimap, а

  1. вам не нужна изменчивость,
  2. вы делаете не имеет нулевых значений.

Если это так, все, что вам нужно, это ImmutableMultimap#inverse():

ImmutableListMultimap<Integer, String> originalMultimap = ImmutableListMultimap.of(
        1, "foo",
        1, "bar",
        2, "baz",
        42, "foo"
);
ImmutableListMultimap<String, Integer> convertedMap = originalMultimap.inverse();
System.out.println(convertedMap);   // {foo=[1, 42], bar=[1], baz=[2]}

Я использовал ImmutableListMultimap вместо ImmutableMultimap потому что документы рекомендуют делать это :

Предупреждение: избегайте прямого использования ImmutableMultimap в качестве типа (как и в случае Multimap). Предпочитайте подтипы, такие как ImmutableSetMultimap или ImmutableListMultimap, которые имеют четко определенную семантику equals(java.lang.Object), таким образом избегая общего источника ошибок и путаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...