gpt4 book ai didi

java - 尝试将嵌套 for 循环表示为 Java Stream,但感到困惑

转载 作者:行者123 更新时间:2023-12-02 19:14:38 25 4
gpt4 key购买 nike

我试图更好地理解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 并使用生成集中的包含来简化:

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

关于java - 尝试将嵌套 for 循环表示为 Java Stream,但感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63837076/

25 4 0