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

标签 java arrays

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

我的第一个 map 包含文件名的 map 和该文件包含的标签列表。

Map<String, List<String>> map1

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

Eg:- map1 = [{file1, [@tag1, @tag2]},{file2, [@tag3, @tag1]}]
--> 
map2 = [{@tag1, [file1, file2]}, {@tag2, [file1]}, {@tag3, [file2]}]

最佳答案

使用 Java 8 流的一种方法是将条目映射到对(字符串、字符串),然后按代表标记值的一个对它们进行分组并收集到映射。

在这种情况下,传统方法可能会更有效。

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

关于java - 使用java中的lambda表达式将一个映射转换为另一个映射的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44089380/

相关文章:

java - 泛型方法和泛型类中的类型推断

javascript - 使用 javascript 数组的 highcharts 饼图

java - 如何在 jackson 反序列化过程中忽略 json 数组的类型信息?

java - 删除拆分数组上带有 0 的列

c# - 将数组值返回到列表框 (C#)

C++ 通用 int 数组和 vector 迭代器

java - 使用自定义 hibernate 类型时的 ehcache bug?

java - Spring Social - 无法生成 CGLIB 子类

java - 如何将身份验证 header 传递给 JAXWS SOAP 客户端

java - 从事件对象打印所有时间间隔的好方法