java - 使用java流从另一个对象列表更新对象列表

标签 java collections java-stream

我有一个对象 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/

相关文章:

javascript - 如何使用 Selenium 根据亚马逊上自动建议的某些建议将 "click"化?

java - 如何将 BindingResult 作为请求参数传递?

java - 缓冲文件读取器的问题

c# - 如何在 C# 中将 List<string> 转换为 ReadOnlyCollection<string>

java - Java 应用程序性能是否取决于将变量传递给方法?

C# 如何用另一个集合中的对象替换一个集合中的对象

java - 如何获取 IntStream.map.forEach 的索引?

java - 解释为什么需要在方法内实例化对象数组的元素

java - 检查 Java Map<T, ?延伸 E>

java - 如何使用 Java Streams API 在两个相同维度的列表之间进行元素明智的乘法