java - 我使用 IntStream 和 forEach 创建整数列表的方法有什么问题?

标签 java java-8 java-stream

我的原始代码是:

class ${
    public static void main(String[] _) {
        final List<Integer> ints = new ArrayList<>();
        IntStream.iterate(0, i -> i++).limit(5).forEach(val -> ints.add(val));
        System.out.println(ints);
    }
}

我期望在控制台中看到以下内容:

[0, 1, 2, 3, 4]

但实际情况是:

[0, 0, 0, 0, 0]

这可能是非常简单的事情,但我错过了什么?

最佳答案

i++ 在递增之前 的值为 i。您需要使用前缀运算符。

IntStream.iterate(0, i -> ++i).limit(5).forEach(val -> ints.add(val));

实际上,不要那样做。没有理由改变 i,它只是被丢弃了。使用无副作用版本。毕竟,这就是函数式编程背后的全部理念:避免副作用。

IntStream.iterate(0, i -> i + 1).limit(5).forEach(val -> ints.add(val));

对于连续整数流的特定情况,您可以将 iteratelimit 替换为 range :

IntStream.range(0, 5).forEach(val -> ints.add(val));

最后,最好将流收集到一个列表中,而不是使用 forEach 添加值。它直接表达了创建列表的意图,这再次避免了副作用。

List<Integer> ints = IntStream.range(0, 5).boxed().collect(Collectors.toList());

关于java - 我使用 IntStream 和 forEach 创建整数列表的方法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53182741/

相关文章:

java - 带有 lambda 的 foreach 是否容易出现商品化错误

java - Java REST Web 服务情况下的服务详细信息

java - 无法在 Visual Studio Code 中运行 java 代码

java - 使用 Lambda 将列表项返回为字符串

java - 使用 Java 8 流时更新现有的 Map 对象

java - Sonarqube 给出了 HashMap 初始化代码合规问题

Java - 公历

java - 如果新的应用程序版本可用,如何触发更新(来自 GITHUB)

java - Java 中的 Lambda 函数会跳过元素

java - 如何使用字符串流扩展(解析)路径