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

在java中使用lambda表达式将一个映射转换为另一个映射的最简单方法,java,arrays,Java,Arrays,这个问题可能与其他问题类似,但我搜索的大多数问题要么涉及将一个地图复制到另一个地图,要么涉及原始数据类型。 我拥有的第一个映射包含文件名映射和文件包含的标记列表。 Map<String, List<String>> map1 使用Java8流的一种方法是将条目映射到对(String,String),然后按表示标记值的一个对它们进行分组,并收集到映射 在这种情况下,传统方法可能会更加有效 Map<String, List<String>> map1

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

我拥有的第一个映射包含文件名映射和文件包含的标记列表。

Map<String, List<String>> map1

使用Java8流的一种方法是将条目映射到对(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()));

若你们有完整的工作代码,那个么它真的应该发布在代码评审上。此站点主要用于修复损坏的代码。在那里发布您当前的完整解决方案,他们可以帮助您调整它以提高效率。我同意@Carcigenicate,但我想了解如何使用Lambda表达式来完成。我不认为在这里展示旧的时尚代码会有任何帮助。请注意,您要求的两件事不一定相同:“使用lambda”(我想您更倾向于使用Java8流)和“比创建循环和遍历列表更有效”。通常,我们使用streams+lambda主要不是为了获得更高效的代码,而是为了获得更可读、更易于维护的代码。我坚信,在许多情况下,好的旧循环比过于复杂的流构造更有效:)是的,你是对的!我的意思是使用streams来查看如何实现,并使用lambda表达式使其更具可读性,就像您提到的那样。但如果循环比流更有效,我想我会坚持旧的is gold方法:)
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]]