[英]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
值列表中。
您的第一次嘗試不起作用,因為它將每個ObjectA
的getPropertyId
與隨機ObjectB
的getPropertyId
進行比較(因為您正在調用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.