scala - 使用Java库的Scala,利用Java 8中的lambda表达式支持

标签 scala lambda javafx java-8 javafx-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

我在这里想念什么?还是根本不可能像上述示例一样将Lambda表达式从Scala传递给Java?

最佳答案

对于scala 2.12版本起,将立即提供支持。
2.12之前的状态:
Lambdas是用Java语言引入的,与scala函数有一些共同之处。它们被编译为different bytecode,具有不同的层次结构(scala函数早在这里,而且显然Java设计人员选择了与scala不兼容的洁净室实现)。
当前支持非常有限,并且您尝试做的事情是不可能的(开箱即用):

Scala 2.11系列针对Java 6,并具有(不断发展的)实验性
支持Java8。在2.11中,Java 8支持主要限于
读取Java 8字节码并解析Java 8源。我们将会
全面扩展Scala(实验性)Java 8支持和互操作
2.11系列。 - 更多信息请访问:
https://typesafe.com/blog/scala-211-has-arrived#sthash.ukr4FSpU.dpuf

ongoing efforts可以解决此问题
另请参见discussion on scala roadmap to support java 8 functions

关于scala - 使用Java库的Scala,利用Java 8中的lambda表达式支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24369449/

相关文章:

scala - Kafka 生产者从本地 Linux 文件夹中读取数据

scala - map 的特殊行为

c# - 将 'Set Next Statement' 强制为 'if' block 时出现 CLR System.NullReferenceException

c++ - 在 VS2010 中使用 lambda 函数作为函数指针时遇到问题

Java 桌面应用程序框架与 JavaFX

java - 如何在java swing中提供资源的路径

scala - 只做一次,没有状态

scala - 我可以在另一个多项目中有一个 sbt 多项目吗?

Python:在 map 对象上调用 'list' 两次

java - 有没有办法管理 fxml 中的重复图像路径?