加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

对于Groovy和Java中的循环工作不同

发布时间:2020-12-14 16:35:23 所属栏目:大数据 来源:网络整理
导读:请看看下面的代码片段在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”被打印了几次? 而且,一切看起来都很好运行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”被打印了几次?
而且,一切看起来都很好运行Java中的等效代码:

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 defines closures as instances of the Closure class. It makes it very different from 07002. 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有羔羊,两种语言不断分歧.警告程序员.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读