java8 stream不会更改类成员

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)

Jar*_*lak 6

流操作是惰性的,除非您关闭诸如forEach或之类的终端操作,否则不会执行collect.

在这种情况下使用forEach而不是map.map是一个中间操作.

顺便说一下,你的isValid方法修改字段听起来非常讨厌副作用.如果你打电话给它true,在第二次通话时你会得到false.无论如何,我不太明白这种方法 - 因为(一旦你修复它)它将始终true在第一次调用和false所有后续调用时返回.唯一的例外是空列表,在这种情况下它将始终返回true.

编辑:

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

input.stream().distinct().count() == input.size()
Run Code Online (Sandbox Code Playgroud)