java8 流不会更改类成员

标签 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();
}

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/

相关文章:

java-stream-List of Long to list in one line

java - 如何使用 java 8 Stream API 将特定对象移动到列表的开头?

java - 如何以 Java 8 方式获取特定 URL 上的文本行流?

java - libGDX - 以有效的方式制造脚步

java - 使用变换矩阵旋转多边形。图形变形

java - 如何使用 Java 8 在 HashMap 列表上进行多重聚合

java - 分组和减少对象列表

JavaFX 入门 : Modifying Label Text on other window from Main Window

java - 圆形 JPanel Swing

methods - Java 8 中方法引用和 lambda 的类型