gpt4 book ai didi

java - For 循环在 Groovy 和 Java 中的工作方式不同

转载 作者:太空狗 更新时间:2023-10-29 22:57:21 26 4
gpt4 key购买 nike

请查看以下 groovy 中的代码片段:

def static void main(String... args) {
def arr = [1, 2, 3, 4, 5]
for (int f in arr) {
Thread.start { print f + ', '}
}
}
Out: 2, 3, 5, 5, 5,

我对这个输出感到惊讶。为什么“5”被打印了好几次?此外,在 Java 中运行等效代码一切看起来都很好:

public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4, 5};
for (int f : arr) {
new Thread(() -> { System.out.print(f + ", "); }).start();
}
}
Out: 1, 5, 4, 3, 2,

谁能解释一下为什么会这样?看起来 groovy 的问题出在 Closure 实现中。但是,这种行为很奇怪。这是某种错误还是我只是不知道 groovy 是如何工作的?

谢谢!

最佳答案

Java 闭包在创建时关闭f 中的不可变值,而 Groovy 闭包关闭可变变量 f

因此,一旦 Groovy 循环完成,f 包含 5 并且碰巧在该循环之后运行的线程将打印 5

Java 闭包 可以关闭最终或“有效最终”的变量引用,这意味着它除了名称之外都是最终的。参见 Java 8: Lambdas, Part 1 .这就是内部类可以做的以及一些有用的便利。

Groovy 闭包 是非常不同的对象,它们早于 Java 闭包。参见 Groovy Closures ,其中示例 {++item } 修改封闭范围中的变量。

Groovy defines closures as instances of the Closure class. It makes it very different from lambda expressions in Java 8. Delegation is a key concept in Groovy closures which has no equivalent in lambdas. The ability to change the delegate or change the delegation strategy of closures make it possible to design beautiful domain specific languages (DSLs) in Groovy.

底线 Groovy 旨在成为与 Java 具有最佳“阻抗匹配”的动态语言,但现在 Java 有了 lambda,这两种语言继续存在分歧。警告程序员。

关于java - For 循环在 Groovy 和 Java 中的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34283443/

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