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

Ram*_*han 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ful*_*Guy 8

您可以使用Collectors.toMap(), 创建一个新的Map区域 id 作为键,区域作为值,如果存在重复项,则从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;
                             }));
Run Code Online (Sandbox Code Playgroud)

  • @RamViswanathan 是的,我已经更新了我的答案。现在,如果两个区域之间存在 ID 匹配,则具有相同区域 ID 的区域将合并部件。 (2认同)