转换Java映射<;Obj1,集合<;Obj2>&燃气轮机;映射<;Obj2,集合<;Obj1>&燃气轮机;

转换Java映射<;Obj1,集合<;Obj2>&燃气轮机;映射<;Obj2,集合<;Obj1>&燃气轮机;,java,guava,Java,Guava,将Map转换为Map的最佳做法是什么 我试着用MultiMap来做这件事 Map<Obj1, Collection<Obj2>> originalMap = ...; Multimap<Obj1, Obj2> multiMap = ArrayListMultimap.create(); originalMap.forEach(multiMap::putAll); Map<Obj2, Collection<Obj1&g

Map
转换为
Map
的最佳做法是什么

我试着用
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();
Map originalMap=。。。;
Multimap Multimap=ArrayListMultimap.create();
原始映射forEach(multiMap::putAll);
Map convertedMap=Multimaps.invertFrom(multiMap,ArrayListMultimap.create()).asMap();

有更好的方法吗?

您可以通过Java8流实现同样的效果

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())
                )
        );

Map originalMap=。。。
Map reversedMap=originalMap.entrySet().stream()
.flatMap(obj2s->obj2s.getValue().stream())
.map(obj2->map.entry(obj2,obj2s.getKey()))
.收集(
收集者分组(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,Collectors.toList())
)
);

fltMap
Map
转换成一个类似
的元组,然后通过
Obj2
收集结果分组。您的方法是正确的,但如果您首先使用
多映射
,可能会更直接

  • 你不需要易变性
  • 你没有空值
  • 如果是这样,您只需要:

    ImmutableListMultimap originalMultimap=ImmutableListMultimap.of(
    1、“福”,
    1.“酒吧”,
    2、“baz”,
    42,“富”
    );
    ImmutableListMultimap convertedMap=originalMultimap.inverse();
    System.out.println(convertedMap);//{foo=[1,42],bar=[1],baz=[2]}
    
    我使用了
    ImmutableListMultimap
    而不是
    ImmutableMultimap
    ,因为:

    警告:避免将
    ImmutableMultimap
    直接用作类型(与
    Multimap
    本身一样)。首选子类型,如
    ImmutableSetMultimap
    ImmutableListMultimap
    ,这些子类型具有定义良好的
    equals(java.lang.Object)
    语义,从而避免常见的bug和混淆源

    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]}