Java8将列表转换为映射以处理重复的键和操作值

时间:2019-03-25 05:51:17

标签: 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构造一个映射: 如果密钥(基于区域的“ Id”)是新的,则在地图中使用密钥和区域创建一个条目。 如果密钥是重复项,则将此重复区域的所有“部分”附加到现有区域的部分列表中。 最后,我应该有一个映射,其中区域的“ Id”作为键,区域作为值。

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

1 个答案:

答案 0 :(得分:2)

您可以使用Collectors.toMap()来创建一个新的Map,以区域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;
                             }));