[英]Scala using Java libraries, taking advantage of lambda expressions support in Java 8
根据: http : //docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#lambda-expressions-in-gui-applications
先前:
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
现在,我们可以:
btn.setOnAction(
event -> System.out.println("Hello World!")
);
现在,我在使用Java库时尝试在Scala中执行此操作。
我正在使用JavaFX(Java 1.8 SE中默认包含它)。 尝试:
chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
但是,我得到:
Error:(204, 46) type mismatch;
found : javafx.scene.input.MouseEvent => Unit
required: javafx.event.EventHandler[_ >: javafx.scene.input.MouseEvent]
chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
^
旧样式很好用:
chart.setOnMouseClicked( new EventHandler[MouseEvent] {
override def handle(event: MouseEvent): Unit = println("NOT NOICE")
} )
我在IntelliJ中将项目语言级别设置为Java 8,我使用的是Scala 2.11.1,以及来自Oracle 1.8.0_05的Java
我在这里错过了什么? 或者是否根本无法将Scala中的lambda表达式传递给Java,就像在上述示例中所做的那样?
对于scala版本2.12以后的支持是开箱即用的。
Lambdas是用java 语言引入的,与scala函数有一点共同之处。 它们被编译成不同的字节码 ,具有不同的层次结构(scala函数很久以前就已存在,显然java设计者选择了无法与scala兼容的洁净室实现)。
目前支持非常有限, 你想要做的事情是不可能的 (开箱即用):
Scala 2.11系列针对Java 6,具有(不断发展的)Java 8实验支持。在2.11中,Java 8支持主要限于读取Java 8字节码和解析Java 8源代码。 我们将在2.11系列中扩展Scala(实验性)Java 8支持和互操作。 - 详情请见: https : //typesafe.com/blog/scala-211-has-arrived#sthash.ukr4FSpU.dpuf
目前正在努力解决这个问题
另请参阅有关scala路线图的讨论以支持java 8函数 。
实现此目的的一种方法是使用隐式转换 ,您需要做的是创建一个处理所有这些转换的新Object,如下所示:
import javafx.scene.input.MouseEvent
import javafx.event.EventHandler
object FXEvent2HandlerImplicits{
implicit def mouseEvent2EventHandler(event:(MouseEvent)=>Unit) = new EventHandler[MouseEvent]{
override def handle(dEvent:MouseEvent):Unit = event(dEvent)
}
}
然后只需将其导入到您可能需要转换的任何文件中:
import FXEvent2HandlerImplicits._
//From now on within scope you can now call events like Java8 Lambdas
chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
这只是一种语法糖,以更优雅的方式存档相同的东西
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.