簡體   English   中英

Java 從其他兩個具有不同對象和共同屬性的列表構建一個列表

[英]Java build a list from two other lists with different objects and common property

我正在嘗試從另外兩個不同對象的列表中構建一個具有共同屬性的列表。 我正在使用 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;
     }

非常感謝您的幫助。

我認為您想返回ObjectA實例,其中值getProperty().getPropertyId()存在於某些ObjectB值列表中。

您的第一次嘗試不起作用,因為它將每個ObjectAgetPropertyId與隨機ObjectBgetPropertyId進行比較(因為您正在調用findAny )。

你想要這樣的東西:

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

但是,如果列表很大,這種方法可能會很慢,因為您正在掃描ObjectB列表一次以查找ObjectA列表的非常成員。 您最好構造一個存在於ObjectB列表中的 ID 的HashSet ,然后從該集合中的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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM