当前位置: 首页 > 知识库问答 >
问题:

为什么在lambda中使用++i而不是i++

穆鸿卓
2023-03-14

我碰巧知道,在下面的表达式中,使用I++将导致无限流,I将始终为0。我之所以困惑是因为我认为I++返回的值没有被使用,即便如此,它也不应该中断I之后的增量。

IntStream.iterate(0, i-> i<10, i-> ++i).forEach(....)

共有1个答案

拓拔耀
2023-03-14

通过检查Java9intStream的API:http://download.Java.net/Java/jdk9/docs/API/Java/util/stream/intstream.html#iterate-int-java.util.function.intpredicate-java.util.function.intunaryoperator-

最后一个函数(在您的示例中为i->++i)是确定下一个值。

如果您将i->i++,假定它是后缀增量运算符,i++在增量之前计算为i。这意味着它总是返回相同的值(在您的示例中是seed0)。因此,它的工作方式就像您将i->i。请注意,Java中的参数是按值传递的。因此lambda中的增量不会影响调用方。

因此,hasnext谓词(第2个参数,在您的例子中,i->i<10)的计算结果总是为true,因此给您一个无限的全零流。

 类似资料:
  • 问题内容: 也许对编译器进行优化后并不重要,但是在C / C ++中,我看到大多数人以以下形式进行for循环: 使用postfix 完成增量操作。我得到了两种形式之间的区别。i 返回i的当前值,但是在安静时将1加到i。++ i首先将1加到i,然后返回新值(比i大1)。 我认为i 需要做更多的工作,因为除了下一个值外,还需要存储一个前一个值:推 (&i)进行堆栈(或加载至寄存器);递增(&i)。与

  • 问题内容: 在Scrapy docs中,有以下示例说明如何在Scrapy中使用经过身份验证的会话: 我已经做好了,很好。但是 我的问题是 :正如他们在最后一行的评论中所说,您需要做什么? 问题答案: 在上面的代码中,用于进行身份验证的将该函数设置为其回调。这意味着该函数将被调用并传递登录尝试得到的页面作为响应。 然后,通过在页面中搜索特定的字符串(在本例中为)来检查您是否成功登录。如果找到它,蜘蛛

  • 问题内容: 我知道这是电气工程惯例,但是我仍然想知道为什么选择Python。我不知道其他具有复数文字的编程语言,因此我没有什么可比较的,但是有人知道有使用i的语言吗? 问题答案: 如您所料,这似乎是因为Python遵循电气工程惯例。这是Python Bug跟踪器Issue10562的交换: BoštjanMejak :在Python中,字母“ j”表示虚数单位。如果我们在这方面遵循数学并以“ i”

  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 问题内容: 当我尝试在/ decrement中写一个后缀/前缀,然后在/ decrement中写一个后缀/前缀时,出现以下错误: 操作++ /-的无效参数 。 但是,根据JLS: 和 所以写: 应该有可能…有什么想法吗? 问题答案: 请注意,原始语法缺少任何语义。这只是语法,并不是每个语法上有效的程序通常都是有效的。例如,语法通常没有涵盖使用前必须声明变量的要求(可以,但是很麻烦)。 Postfi

  • 问题内容: 我不明白何时对ajax请求使用Angular over jquery。 例如,为什么要使用: 代替 ?? 问题答案: 我的理解是,首选第一个原因有两个: $ http是可测试的。实际上,可以将其使用的后端存根并测试$ http请求,而无需 实际 发送请求。 $ http为您执行一些常见的“工作”,例如在POST请求中为您将内容类型设置为“ application / json”。 $