我有一个对象 A 的列表
A{
name
age
dob
}
和对象B的列表
B{
name
dob
}
.
我总是得到 A 的列表,其中 A.dob 为空。以及 B 的列表,其中 B.dob 具有值(value)。 我需要循环遍历 A 列表和 B 列表,使用每个 A 和 B 对象中的名称字段查找公共(public)对象,并使用 B.dob 更新 A.dob
这可以使用流来完成吗?
最佳答案
您不应使用 Stream API 来更改对象的状态。
如果你还想修改的话,
您可以迭代 A
列表中的每个元素,过滤 dob 是否为 null,根据 B
列表中的相应名称查找 dob。
List<A> aList = new ArrayList<>();
List<B> bList = new ArrayList<>();
aList.stream()
.filter( a -> a.dob == null)
.forEach( a -> {
Predicate<B> nameFilter = b -> b.name.equals(a.name);
a.dob = findDob(nameFilter, bList);
});
static String findDob(Predicate<B> nameFilter, List<B> bList) {
B b = bList.stream()
.filter(nameFilter)
.findFirst()
.orElse(new B());
return b.dob;
}
替代有效解决方案:考虑到每个对象 B 都有唯一的名称,您可以使用该映射准备查找并查找年龄,这样您就不需要迭代 bList
对于 aList
List<A> aList = new ArrayList<>();
List<B> bList = new ArrayList<>();
Map<String, String> nameDobLookup = bList.stream()
.collect(Collectors.toMap(b -> b.name, b -> b.dob));
aList.stream()
.filter(a -> a.dob == null)
.forEach(a -> a.dob = nameDobLookup.get(a.name));
关于java - 使用java流从另一个对象列表更新对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60304025/