我有这个代码:
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();
}
最佳答案
流操作是惰性的,除非您关闭终端操作(例如 forEach
或 collect
),否则不会执行。
在这种情况下,使用 forEach
而不是 map
。 map
是一个中间操作。
顺便说一句,您的 isValid
方法修改字段听起来像是非常令人讨厌的副作用。如果您调用一次并获得 true
,那么在第二次调用时您将获得 false
。无论如何,我不太理解这个方法 - 因为(一旦你修复它)它将始终在第一次调用时返回 true
,并在所有后续调用中返回 false
。唯一的异常(exception)是空列表,在这种情况下它将始终返回 true
。
编辑:
仔细看看你的方法,如果你只想查找列表是否包含重复项,你可以这样做:
input.stream().distinct().count() == input.size()
关于java8 流不会更改类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39974844/