使用java中的lambda表达式将一个地图转换为另一个地图的最简单方法

时间:2017-05-20 18:23:12

标签: java arrays

这个问题可能与其他问题类似,但我搜索的大多数问题都涉及将一张地图复制到另一张地图或者具有原始数据类型。

我的第一张地图包含一个fileName的地图和一个文件包含的标签列表。

v0.1 -> one commit -> v0.2 -> one commit -> v0.3

现在我想转换上面的Map<String, List<String>> map1 ,以便创建一个带有包含这些标签的文件列表的标签映射。 我使用传统方法实现了它,但我想要的东西比创建循环和迭代列表更有效。

map1

1 个答案:

答案 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]]