将两个不同的对象列表合并为一个具有共享ID字段的对象

时间:2018-08-17 19:04:00

标签: java java-8 java-stream

我有两个类似的对象列表:

public class Person {
    private int id;
    private String name;
    private String surname;
}

public class Name {
    private int id;
    private String name;
}

我的Person列表中没有填写名称字段。我需要将其与与字段 id 匹配的Name列表合并。

问题:如何使用 Java 8 流实现此目的的最佳方法?

2 个答案:

答案 0 :(得分:2)

您可以这样做:

 Map<Integer, String> map = names.stream().collect(Collectors.toMap(o -> o.id, o -> o.name));
 for (Person person : persons) {
    person.name = map.getOrDefault(person.id, "");
 }

假设名称是您的Names列表,而人员是您的Person列表,同样,如果未找到人员id,则默认name是空字符串。

答案 1 :(得分:2)

首先,使用Map更好地访问Name对象,因此这里使用流是一种解决方案:

List<Person> personList = ...
List<Name> nameList = ...
Map<Integer,String> nameMap = nameList.stream()
.collect(Collectors.toMap(Name::getId,Name::getName));
personList.forEach(person -> person.setName(nameMap.getOrDefault(person.getId(), "")));