java-8 - Java 8 将列表转换为映射处理重复键和操作值

标签 java-8 java-stream

我有以下数据结构

public class Zones {

   private List<Zone> zones;
}

public class Zone {

  private int id;
  private String name;
  private List<Part> parts;
}

public class Part {
  private int id;
  private String name;
}

这是我的问题。我有一个 Zones 实例,比如 z。

我想流式传输 z 并执行以下操作: 使用以下条件从 z 构建 map : 如果 key (基于区域的“Id”)是新的,则使用 key 和区域在 map 中创建一个条目。 如果 key 重复,则将此重复区域的所有“部分”附加到现有区域的部分列表中。 最后,我应该有一个以区域的“Id”为键,以区域为值的 map 。

我如何在 Java8 中使用流来做到这一点?

最佳答案

您可以使用 Collectors.toMap() , 制作一个新的 Map以 zone id 为键,以 Zone 为值,如果有重复则取 List<Part>从第二个区域并将其附加到第一个区域:

  Map<Integer, Zone> map = z.getZones().stream()
                            .collect(Collectors.toMap(Zone::getId, Function.identity(), 
                             (zone1, zone2) -> {
                               zone1.getParts().addAll(zone2.getParts());
                               return zone1;
                             }));

关于java-8 - Java 8 将列表转换为映射处理重复键和操作值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55331901/

相关文章:

java.lang.NoClassDefFoundError : Failed resolution of: Ljava/time/Instant; 错误

java - 如何在 java 8 或更高版本编译的 java 7 上运行 Jar

java - 在 Stream.generate().forEach() 中找不到方法

java - 使用流总结列表

java - For 循环将自定义对象添加到 arraylist n 次 - Java8

java - 如何从 Java 8 流的中间删除一个收集到新流中?

带有 Java 8 补丁的 Eclipse 4.3.2 无法识别源级别 1.8

java - 使用带有默认方法的新 Java8 接口(interface)

java - Collectors.toMap() 中映射的默认值

java - 使用流将 Map<String,Map<String,Integer>> 转换为 Map<String,Integer>