Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lambda 为什么使用++;我,但不是我++;在兰姆达_Lambda_Java 9 - Fatal编程技术网

Lambda 为什么使用++;我,但不是我++;在兰姆达

Lambda 为什么使用++;我,但不是我++;在兰姆达,lambda,java-9,Lambda,Java 9,我碰巧知道,在下面的表达式中,使用I++将导致无限流,I将始终为0。我感到困惑是因为我认为没有使用I++返回值,即使如此,它也不应该在之后中断I增量 IntStream.iterate(0, i-> i<10, i-> ++i).forEach(....) IntStream.iterate(0,i->i++i).forEach(…) 您可以使用limit并执行您的建议: IntStream.iterate(0, i -> i++).limit(10).forEach(

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

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

您可以使用limit并执行您的建议:

IntStream.iterate(0, i -> i++).limit(10).forEach(....)
这也有助于:


通过检查Java 9的API
IntStream

最后一个函数(
i->++i
)是确定下一个值

如果你把
i->i++
放进去,假设它是一个后缀递增运算符,
i++
在递增之前计算为
i
。这意味着它总是返回相同的值(在您的情况下,seed
0
)。因此,它的工作原理就像您在放置
i->i
。请注意,Java中的参数是按值传递的。因此,lambda中的增量不会影响调用者


因此,
hasNext
谓词(第二个参数,
i->i记住,lambda表达式是一种将函数接口(只有一个抽象方法的接口)的实现表示为匿名函数的方法

在iterate()方法中,第三个参数是IntUnaryOperator。它有一个抽象方法applyAsInt(),该方法将int作为参数并返回int。如果将Lambda表达式重新编写为等效的匿名内部类(您可以在此处合法使用),则会得到:

IntStream.iterate(0, i -> i < 10, new IntUnaryOperator() {
  @Override
  public int applyAsInt(int i) {
    return i++;
  }
})
.forEach(System.out::println);
IntStream.iterate(0,i->i<10,新的IntUnaryOperator(){
@凌驾
公共int applyAsInt(int i){
返回i++;
}
})
.forEach(System.out::println);

在这种情况下,很明显,您在i的值递增之前返回i(后缀运算符)。i的初始值为零,因此您将得到一个无限的零流。如果更改applyAsInt()方法使用前缀运算符++i,i的值将在返回之前递增,从而得到所需的1、2…9的结果

,但仍然想知道为什么
i++
不会增加
i
。这对“常识”提出了挑战对我来说。@Tina在Java中的参数是按值传递的。我相信你还没有发展出Java的常识。@Tiina希望通过我的更新和adrian帮助你解决问题answer@DamianLattenero更新让答案变得更糟。这个问题是关于Java的,Java中没有运算符重载。@AdrianShum关于“常识”请看我在您的答案中留下的第一条评论……我对java9不太熟悉,但应该是nt
IntStream.iterate(0,I->I+1.forEach(…)
更自然些?你有什么理由使用
i++
++i
?@ymonad
i+1的可能副本也能工作。我想知道为什么
i++
不能。现在很清楚了。
i++
在函数中运行,函数返回值被分配给
i
。有一个非常混乱的顺序
i->i++
.1)
i
中的nce分配给
i
,2)
i
增加1。但无论哪个先到,除非
i
永远不会增加1(就像
++
操作符总是增加一样),
i
不应该永远是0。这是我不理解的部分。第三个参数是一个函数,用于告诉
IntStream
下一个值是什么(给定前一个值)。不管你在函数中做什么,只要你返回了特定的值,返回的值就是下一个要使用的值。换一种方式来说,
i->i++
在你的例子中就像
i->{int temp=i;i=i+1;return temp}
。给定参数是按值传递的,您的
i=i+1
对调用者没有影响。所以下一个值总是和原始值一样。啊,我明白了