我的原始代码是:
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));
对于连续整数流的特定情况,您可以将 iterate
和 limit
替换为 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/