gpt4 book ai didi

lambda - 使用 lambda 表达式的后缀与前缀递增

转载 作者:行者123 更新时间:2023-12-04 00:10:25 26 4
gpt4 key购买 nike

这个问题绝对不是重复的,因为我不是指一般的后/前递增求值,而是专门指在 lambda 表达式中使用递增,这显然是不同的。每个人都可以自由确认代码只会在您通常期望变量值增加的地方返回零。没有对此发布任何答案。

我很清楚后置和前缀增量的不同评估和增量时刻。不过,我还是不明白为什么这只返回零:

Stream.iterate(0, e -> e++)
.limit(10)
.forEach(System.out::println);

检查时,我看到 e 在第一次迭代期间被初始化为 0,然后递增。所以第二次迭代应该产生 e = 1,但显然它没有。我错过了什么?

此外,如果我反转增量,它会按预期工作,列出从 0 到 9 的所有数字:

Stream.iterate(0, e -> ++e)
.limit(10)
.forEach(System.out::println);

最佳答案

主要问题是您使用的表达式旨在产生没有效果的副作用。好的 IDE、编译器或审计工具应该对此发出警告。

e -> expression 形式的 lambda 表达式有一个名为 e参数。这不能与堆变量混淆。表达式 e++++e修改参数,它没有任何效果,持续时间比单个函数评估更长。它与例如像这样的方法

static int myFunction(int e) {
return e++; // or ++e
}

e的修改没有持久化效果,唯一重要的是最终会返回什么值,所以e ->++e等价于e -> e+1e -> e++ 等同于 e -> e 因此,你应该使用 e -> e+1e -> e 强调将返回什么,而不会对参数变量产生分散注意力的副作用。

但如评论中所述,在这种特定情况下,您应该使用 IntStream.range(0, 10) 而不是 Stream.iterate(0, e -> e+1) .limit(10)IntStream.range 不仅清楚地记录了意图,而且在当前的实现中,它对很多流操作都有性能优势。

关于lambda - 使用 lambda 表达式的后缀与前缀递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36800764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com