Java从其他两个具有不同对象和公共属性的列表构建一个列表

Posted

技术标签:

【中文标题】Java从其他两个具有不同对象和公共属性的列表构建一个列表【英文标题】:Java build a list from two other lists with different objects and common property 【发布时间】:2020-10-09 23:14:31 【问题描述】:

我正在尝试从另外两个不同对象的列表中构建一个具有共同属性的列表。我正在使用 Stream 库,但无法使代码正常工作。这是我尝试过的:

尝试 1(仅返回 ObjectAList 的第一个元素):

private List<ObjectA> getFilteredObjectAList() 

    return ObjectAList.stream()
            .filter(a -> a.getProperty().getPropertyId().equals(
                    (ObjectBList.stream().map(b -> b.getPropertyId())).findAny().orElse(null)))
            .collect(Collectors.toList());

尝试 2(这会引发错误“此表达式的目标类型必须是函数式接口”):

private List<ObjectA> getFilteredObjectAList() 
     List<ObjectA> list;
     ObjectAList.stream()
     .forEach(a -> a.getProperty().getPropertyId()
     .filter((ObjectBList.stream()
     .map((b -> b.getPropertyId())::contains ? list.add(t) : "".isEmpty())))
     .collect(Collectors.toList()));
     return list;
     

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

我认为您想返回 ObjectAgetProperty().getPropertyId() 存在于某些 ObjectB 值列表中的实例。

您的第一次尝试不起作用,因为它将每个ObjectAgetPropertyId 与随机getPropertyIdgetPropertyId 进行比较(因为您正在调用findAny)。

你想要这样的东西:

private List<ObjectA> getFilteredObjectAList() 
    return ObjectAList.stream()
            .filter(a -> ObjectBList.stream().matchAny(b -> b.getPropertyId() ==
                a.getProperty().getPropertyId())
            .collect(Collectors.toList());

但是,如果列表很大,这种方法可能会很慢,因为您正在扫描ObjectB 列表一次以查找ObjectA 列表的非常成员。您最好构造一个 HashSet 的存在于 ObjectB 列表中的 ID,然后从该集合中的 ObjectA 列表中查找值。

private List<ObjectA> getFilteredObjectAList() 
    Set<String> ids = ObjectBList.stream().map(ObjectB::getPropertyId)
        .collect(Collectors.toCollection(HashSet::new));
    return ObjectAList.stream()
            .filter(a-> ids.contains(a.getProperty().getPropertyId())
            .collect(Collectors.toList());

【讨论】:

谢谢你亲爱的威利斯。我要试试这个。我花了一整天的时间思考解决方案,您的帮助非常宝贵!谢谢,

以上是关于Java从其他两个具有不同对象和公共属性的列表构建一个列表的主要内容,如果未能解决你的问题,请参考以下文章

如何断言两个列表包含 NUnit 中具有相同公共属性的元素?

Jolt-基于索引需要迭代一个列表并从索引中形成公共对象

将对象列表数据绑定到 WinForms DataGridView,但不显示某些公共属性

具有公共多个字段的对象列表中的java 8 sum字段

java 将两个相同对象不同属性list合并?

根据具有不同对象的匹配字段从数组列表中删除重复元素