java - 在 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
上述两种/三种做事方式在变量的使用或范围方面有什么区别?
解决方案
这只是 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)
推荐阅读
- python - 通过 Pyspark (Python) 上的内部连接和过滤条件连接两个数据帧
- python - Python:为什么下次我使用 \t 而不是空格字符时,单词会转到下一次?
- xcode - 确定是否正在使用 Xcode StoreKit 配置文件
- c# - 无法检测 EF Core 中阴影属性的更改
- node.js - 如何解析通过 Insomnia 发送的 JSON
- visual-studio-code - Visual Studio Code 任务的工作目录
- python - 如何实现数字抗混叠滤波器?
- symfony - Symfony 5.2 - 在 Twig 中渲染刺激控制器
- arrays - 我如何找出c中的数组中有多少可用空间?
- node.js - 如何将变量添加到文本区域(MERN)