在Groovy中编码时,“->” lamda运算符有什么问题?

时间:2018-12-21 18:50:52

标签: java groovy lambda closures

关于JavaFX的写法,我这样写:

    MenuItem menuItem1 = new MenuItem("Item 1")
    menuItem1.setOnAction(e -> {
        println "Menu Item 1 Selected"
    })

这在Eclipse中给出了一个错误:“ Groovy:expecting')'found'->'”

    MenuItem menuItem1 = new MenuItem("Item 1")
    menuItem1.setOnAction({ e -> 
        println "Menu Item 1 Selected $e"
    })

这很好。这样:

    menuItem1.onAction = { e ->
        println "Menu Item 1 Selected $e"
    }

第一种方法是在Java8 +中执行此操作的方法。 Groovy为什么说这是非法的,并且在以上两种/三种方式中变量e的使用或范围有什么不同?

1 个答案:

答案 0 :(得分:2)

这只是Java与Groovy之间的区别。 Groovy从一开始就基本上具有闭包-Java在JDK8中添加了lambda。

来自docs

  

Java 8支持lambda和方法引用:

Runnable run = () -> System.out.println("Run");
list.forEach(System.out::println);
     

Java 8 lambda或多或少可被视为匿名内部类。 Groovy不支持该语法,而是使用了闭包:

Runnable run = { println 'run' }
list.each { println it } // or list.each(this.&println)