首页 > 解决方案 > 在 Groovy 中编码时,“->” lamda 运算符有什么问题?

问题描述

搞砸一个 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上述两种/三种做事方式在变量的使用或范围方面有什么区别?

标签: javagroovylambdaclosures

解决方案


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

文档

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)

推荐阅读