java – 以功能反应方式合并2列表

让我们想象以下对象:

class People {
  public int id;
  public String name;
  public Date dateOfDeath;
}

我有2个人名单.

在第一个中,People对象正确设置了ID和NAME.在第二个中,People对象正确设置了ID和DATEOFDEATH.

我需要组合2个列表,以便有一个包含完整People对象(死亡名称和日期)的列表.

在完整的程序方式中,这可以通过双循环来完成,如下所示:

for (People fullPeople : firstList) {
  for (People peopleWithDateOfDeath : secondList) {
    if (peopleWithDateOfDeath.id == fullPeople.id) {
      fullPeople.dateOfDeath = peopleWithDateOfDeath.dateOfDeath;
      break;
    }
  }
}
secondList = null;
// first list is good :)

我该如何以功能的方式实现它?我使用的是Rx-Java,但Java 8 Streams的任何示例都可以轻松转换.

最佳答案
您可以通过构建id到dateOfDeath的id映射来避免O(n2)的复杂性:

Map<Integer, Date> deaths = secondList.stream()
    .collect(toMap(p -> p.id, p -> p.dateOfDeath));

fullPeople.stream()
    .filter(p -> deaths.containsKey(p.id))
    .forEach(p -> p.dateOfDeath = deaths.get(p.id));

或者,如果您想避免改变现有人:

List<People> mergedPeople = fullPeople.stream()
    .map(p -> deaths.containsKey(p.id) 
            ? new People(p.id, p.name, deaths.get(p.id))
            : p
    ).collect(toList());

转载注明原文:java – 以功能反应方式合并2列表 - 代码日志