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的区域,那么名称
会发生什么变化?