簡體   English   中英

使用 Java Stream API 比較 2 個集合並修改元素

[英]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.

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