Java 8 Java8将列表转换为映射处理重复键和操纵值

Java 8 Java8将列表转换为映射处理重复键和操纵值,java-8,java-stream,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; } 公共类区域{ 私人名单区; } 公共

我有以下数据结构

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;
}
公共类区域{
私人名单区;
}
公共课区{
私有int-id;
私有字符串名称;
私人零件清单;
}
公共课部分{
私有int-id;
私有字符串名称;
}
这是我的问题。我有一个区域的实例,比如z

我想流式处理z并执行以下操作: 在以下条件下从z向外绘制地图: 如果密钥(基于区域的“Id”)是新的,则使用密钥和区域在地图中创建条目。 如果键是重复的,则将此重复区域的所有“零件”附加到现有区域的零件列表中。 最后,我应该有一个以分区的“Id”为键、分区为值的映射


如何使用streams在Java8中实现这一点?

您可以使用
收集器.toMap()
,以区域id为键、区域为值创建一个新的
映射,如果存在重复,则从第二个区域获取
列表
,并将其附加到第一个区域:

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

您可以使用
收集器.toMap()
,创建一个新的
地图
,其中区域id为键,区域为值,如果存在重复项,则从第二个区域获取
列表
,并将其附加到第一个区域:

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

谢谢。虽然这有助于按Id分组,但我需要的是合并同一区域的各个部分,以便最终得到一个区域,该区域的“parts”属性中包含聚合的部分。按照目前的方法,我最终得到了一个带有两个区域值的键,它们的区域Id相同。@RamViswanathan是的,我已经更新了我的答案。现在,如果两个区域之间的Id匹配,那么具有相同区域Id的区域将具有合并的部分。感谢Amardeep,这正是我想要的。工作起来很有魅力!我如何接受答案?它确实解决了我的问题。谢谢。虽然这有助于按Id分组,但我需要的是合并同一区域的各个部分,以便最终得到一个区域,该区域的“parts”属性中包含聚合的部分。按照目前的方法,我最终得到了一个带有两个区域值的键,它们的区域Id相同。@RamViswanathan是的,我已经更新了我的答案。现在,如果两个区域之间的Id匹配,那么具有相同区域Id的区域将具有合并的部分。感谢Amardeep,这正是我想要的。工作起来很有魅力!我如何接受答案?它确实解决了我的问题。如果密钥是重复的,那么将此重复区域的所有“部分”附加到现有区域的部分列表中。。。如果
z1
z2
是具有相同id的
区域
,则
名称
会发生什么情况?如果密钥是重复的,则将此重复区域的所有“部分”附加到现有区域的零件列表中。。。如果说
z1
z2
是具有相同id的
区域,那么
名称
会发生什么变化?