对于Groovy和Java中的循环工作不同
请看看下面的代码片段在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,5, 我对这个输出感到惊讶.为什么“5”被打印了几次? public static void main(String[] args) { int[] arr = new int[]{1,5}; for (int f : arr) { new Thread(() -> { System.out.print(f + ","); }).start(); } } Out: 1, 有人可以解释为什么会这样吗?看起来像groovy的问题在Closure实现.但是,这种行为很奇怪.是否有某种错误,或者我只是不知道groovy是如何工作的? 谢谢! 解决方法
Java闭包在创建时关闭f中的不可变值,而Groovy闭包关闭可变变量f.
所以一旦Groovy循环完成,f包含5和线程,碰巧运行后将打印5. Java闭包可以关闭最终或“有效最终”的变量引用,这意味着它是除了名称之外的所有参数.见Java 8: Lambdas,Part 1.这是内部课程可以做的,还有一些有用的方便. Groovy闭包是非常不同的对象,它们早于Java闭包.请参见Groovy Closures,其中示例{item}从封闭范围修改变量.
Groovy的底线旨在成为与Java最好的“阻抗匹配”的动态语言,但是现在Java有羔羊,两种语言不断分歧.警告程序员. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |