这个问题可能与其他问题类似,但我搜索的大多数问题都涉及将一张地图复制到另一张地图或者具有原始数据类型。
我的第一张地图包含一个fileName的地图和一个文件包含的标签列表。
v0.1 -> one commit -> v0.2 -> one commit -> v0.3
现在我想转换上面的Map<String, List<String>> map1
,以便创建一个带有包含这些标签的文件列表的标签映射。
我使用传统方法实现了它,但我想要的东西比创建循环和迭代列表更有效。
map1
答案 0 :(得分:1)
使用Java 8流的一种方法是将对象条目映射到对(String,String),然后将它们分组表示标记值并收集到映射。
在这种情况下,传统方法可能会更有效率。
Map<String, List<String>> map1 = new HashMap(){{
put("file1", Arrays.asList("@tag1", "@tag2"));
put("file2", Arrays.asList("@tag3", "@tag1"));
}};
Map<String, List<String>> map2 = map1.entrySet()
.stream()
.flatMap(entry -> entry.getValue()
.stream()
.map(tag -> new SimpleEntry<>(tag, entry.getKey())))
.collect(Collectors.groupingBy(
SimpleEntry::getKey,
Collectors.mapping(SimpleEntry::getValue, Collectors.toList()))
);
System.out.println(Arrays.toString(map2.entrySet().toArray()));
结果是:
[@tag2=[file1], @tag3=[file2], @tag1=[file2, file1]]