【问题标题】:Java8 convert list to map handling duplicate keys and manipulating valuesJava 8 将列表转换为映射处理重复键和操作值
【发布时间】:2019-08-15 08:18:23
【问题描述】:

我有以下数据结构

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 中使用流来做到这一点?

【问题讨论】:

  • 如果键是重复的,则将此重复区域的所有“部分”附加到现有区域的部件列表中。 ... 中的 name 会发生什么比如z1z2Zone 具有相同的ID?

标签: java-8 java-stream


【解决方案1】:

您可以使用Collectors.toMap(),创建一个新的Map,以zone id 作为键,以Zone 作为值,如果有重复则从第二个Zone 中取出List&lt;Part&gt; 并将其附加到第一个一:

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

【讨论】:

  • 感谢 Amardeep。虽然这有助于按 Id 进行分组,但我需要将同一区域的部分合并,以便我最终得到一个区域,其“部分”属性中包含聚合部分。使用当前的方法,我最终得到一个具有 2 个区域值的键,它们具有相同的区域 ID。
  • @RamViswanathan 是的,我已经更新了我的答案。现在,如果两个区域之间存在 Id 匹配,则具有相同区域 Id 的区域将合并 Parts。
  • 感谢 Amardeep,这正是我想要的。像魅力一样工作!
  • 我如何接受答案?它确实解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多