Ela*_*nda 2 java java-8 java-stream
我有这个代码:
Set<String> namesSet = new HashSet<>();
@Override
public boolean isValid(List<String> input) {
input.stream().map(item -> namesSet.add(item));
return namesSet.size() == input.size();
}
Run Code Online (Sandbox Code Playgroud)
input 是一个包含一个项目的列表.
为什么这个项目没有被添加到namesSet之后stream::map呢?
这里更新是我的修复:
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();
}
Run Code Online (Sandbox Code Playgroud)
流操作是惰性的,除非您关闭诸如forEach或之类的终端操作,否则不会执行collect.
在这种情况下使用forEach而不是map.map是一个中间操作.
顺便说一下,你的isValid方法修改字段听起来非常讨厌副作用.如果你打电话给它true,在第二次通话时你会得到false.无论如何,我不太明白这种方法 - 因为(一旦你修复它)它将始终true在第一次调用和false所有后续调用时返回.唯一的例外是空列表,在这种情况下它将始终返回true.
编辑:
仔细看看你的方法,如果你只想查找列表是否包含重复项,你可以这样做:
input.stream().distinct().count() == input.size()
Run Code Online (Sandbox Code Playgroud)