簡體   English   中英

試圖將嵌套的 for 循環表示為 Java Stream,但很困惑

[英]Trying to represent a nested for loop as a Java Stream, but confused

我試圖更好地理解 Java 中的流,我只是試圖將嵌套的 for 循環表示為流,但我正在努力弄清楚。

我嘗試了一些東西,但我似乎無法掌握它。

例如,這樣的事情。

for (Profile profile : profiles) {
    for (User user : users) {
        if (user.getUserId().equals(profile.getProfileId())) {
           profile.setField(false);
        }
    }
}

作為 Java 中的流如何做到這一點?

我認為您正在嘗試了解流,但讓我說for版本並不差, Stream版本也不是更好:性能測試和直覺可能會幫助您,以及可讀性。

也就是說,你的問題是你的第二個外觀需要第一個工作:

profiles.stream()
        .filter(profile -> users.stream() 
                                .anyMatch(user -> user.getUserId().equals(profile.getProfileId())))
        .forEach(profile -> profile.setField(false));
  

這與您的 for 循環完全不同:您在每個配置文件中多次調用setField ,而在流版本中,只有在有一個匹配的用戶時才會這樣做。 我假設setField是一個 setter,因此,由於它的值是常量,因此調用一次或多次都無關緊要。

在這種情況下,我建議您不要使用第一個流,或者將自己限制為forEach

profiles.forEach(profile -> profile.setField(!users.stream() 
                                   .anyMatch(user -> user.getUserId().equals(profile.getProfileId())));

可以通過首先獲取所有用戶 ID 並使用生成集中的 contains 來簡化:

   var userIds = users.stream().map(User::getUserId).collect(toSet());
   profiles.forEach(profile -> profile.setField(!userIds.contains(profile.getProfileId()));

暫無
暫無

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

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