gpt4 book ai didi

java8 流不会更改类成员

转载 作者:行者123 更新时间:2023-12-03 01:56:58 26 4
gpt4 key购买 nike

我有这个代码:

Set<String> namesSet = new HashSet<>();

@Override
public boolean isValid(List<String> input) {
input.stream().map(item -> namesSet.add(item));
return namesSet.size() == input.size();
}

input 是一个包含一项的列表。

为什么这个项目没有添加到stream::map之后的namesSet中?

更新这是我的修复:

Set<String> namesSet;

@Override
public boolean isValid(List<String> input) {
namesSet = new HashSet<>();
input.stream().forEach(item -> namesSet.add(item));
return namesSet.size() == input.size();
}

最佳答案

流操作是惰性的,除非您关闭终端操作(例如 forEachcollect),否则不会执行。

在这种情况下,使用 forEach 而不是 mapmap 是一个中间操作。

顺便说一句,您的 isValid 方法修改字段听起来像是非常令人讨厌的副作用。如果您调用一次并获得 true,那么在第二次调用时您将获得 false。无论如何,我不太理解这个方法 - 因为(一旦你修复它)它将始终在第一次调用时返回 true ,并在所有后续调用中返回 false 。唯一的异常(exception)是空列表,在这种情况下它将始终返回 true

编辑:

仔细看看你的方法,如果你只想查找列表是否包含重复项,你可以这样做:

input.stream().distinct().count() == input.size()

关于java8 流不会更改类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39974844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com