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