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