[英]Comparing 2 collections and modifying elements with Java Stream API
有兩組對象,例如用戶 - 一組來自 db(userSetDb),另一組 - 新創建的對象 (userSet)。 我需要比較這兩個集合,如果 userSetDb 包含來自 userSet 的元素,則將 userSetDb 中的用戶字段(例如電話號碼)設置為 userSet 中的電話號碼。 (電話號碼字段不包含在重寫的 equals 方法中)
我無法完成 Stream API 表達式:
userSetDb.stream().filter(u -> userSet.contains(u))
.map(u -> userSet.stream().filter(u1 -> u1.equals(u))....
我知道我可以首先從 userSetDb 中刪除類似的用戶,然后從 userSet 中添加所有用戶。 但我想知道如何使用另一個流中的流來做到這一點。 在流中使用流是一個好習慣嗎?
為了使用流 API 做到這一點,首先您需要關聯兩組中相同的用戶。 這意味着您需要從被認為相等的兩個集合中創建一對用戶:
userSetDb.stream()
.map(udb -> Pair.create(udb, userSet.stream().filter(u -> u.equals(udb)).findFirst()))
在這里,我使用org.apache.commons.math3.util.Pair
但任何創建對象元組的類都可以使用。
之后僅過濾具有第二個元素的對(對於存在於兩個集合中的用戶):
.filter(pair -> pair.getSecond().isPresent())
之后更新第一個元素與來自第二個的數據成對:
.forEach(pair -> pair.getFirst().setPhone(pair.getSecond().get().getPhone()));
把所有的東西放在一起,你會得到類似的東西:
userSetDb.stream()
.map(udb -> Pair.create(udb, userSet.stream().filter(u -> u.equals(udb)).findFirst()))
.filter(pair -> pair.getSecond().isPresent())
.forEach(pair -> pair.getFirst().setPhone(pair.getSecond().get().getPhone()));
或者正如@Eklavya 在評論中提到的那樣,您可以使用Map.Entry
實現而不是庫中的Pair
類:
userSetDb.stream()
.map(udb -> new AbstractMap.SimpleImmutableEntry<>(udb, userSet.stream().filter(u -> u.equals(udb)).findFirst()))
.filter(entry -> entry.getValue().isPresent())
.forEach(entry -> entry.getKey().setPhone(entry.getValue().get().getPhone()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.