当前位置: 首页 > 面试题库 >

是否可以在Scala中使用Java 8样式方法引用?

归俊
2023-03-14
问题内容

我正在Scala中开发JavaFX8应用程序,但无法弄清楚如何将方法引用传递给事件处理程序。为了澄清,我没有使用ScalaFX库,而是直接在JavaFX之上构建我的应用程序。

这是相关的代码片段。

InputController.java (我用Java编写了此测试类,以隔离问题以仅使用方法参考)

public class InputController {
    public void handleFileSelection(ActionEvent actionEvent){
        //event handling code
    }

    public InputController() {
        //init controller
    }
}

这有效(Java)

InputController inputController = new InputController();
fileButton.setOnAction(inputController::handleFileSelection);

这不起作用(Scala)

val inputController = new InputController
fileButton.setOnAction(inputController::handleFileSelection)

这是来自编译器(Scala 2.11.6)的错误消息。

Error:(125, 45) missing arguments for method handleFileSelection in class Main;
follow this method with '_' if you want to treat it as a partially applied function
    fileButton.setOnAction(inputController::handleFileSelection)
                                            ^

如果我改用Scala 2.12.0-M2,则会收到其他错误消息。

Error:(125, 45) missing argument list for method handleFileSelection in class Main
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `handleFileSelection _` or `handleFileSelection(_)` instead of `handleFileSelection`.
    fileButton.setOnAction(inputController::handleFileSelection)
                                            ^

Scala是否可以利用本机方式来利用Java
8中引入的方法引用?我知道使用lambda表达式的隐式转换方法,但是我想知道是否有一种方法可以使用类似于Java 8的方法引用,而无需使用lambda
decleration。


问题答案:

inputController::handleFileSelection是Java语法,Scala不支持或不需要Java语法,因为它已经对lambda这样的语法很简短了:inputController.handleFileSelection _inputController.handleFileSelection(_)inputController.handleFileSelection也可以工作,具体取决于上下文)。

但是,在Java中,当需要任何SAM(单个抽象方法)接口时,可以使用lambda和方法引用,而EventHandler该接口就是这样的接口。在2.11版之前的Scala中根本不允许这样做,在2.11版中有实验性支持将lambda与SAM接口一起使用,必须使用-Xexperimentalscalac标志启用,从2.12版开始,它已完全受支持,不需要已启用。



 类似资料:
  • 通常我会在返回特定对象的方法中实现switch case。如下所示: 现在我想知道是否有可能为价值分配目的编写一个开关案例?像下面这样: 当然,它可以通过简单的If-Else语句来实现,这个问题对我来说是为了理解switch case的更多功能 当然,在测试之后,我收到了错误消息

  • 问题内容: 我正在做一个小实验,尝试为嵌套div替换背景颜色。 这是我打算实现的(没有内联样式): 我觉得我一定缺少明显的东西!我尝试过,但这似乎仅适用于一个级别。 这是针对生成div的实验,因此解决方案需要是无止境的(不是沿着div div div div div = white的界线)。我知道使用JavaScript非常简单,只需 寻找纯CSS解决方案即可 。 问题答案: 正如Lister先生

  • 问题内容: 是否可以使用JavaScript更改CSS样式表? 我 不是 在说: 我 AM 谈论改变: 除了做一些肮脏的事情(我们还没有尝试过)之外,比如在头部创建一个新对象,innerHTML在其中创建一个样式标签,等等。尽管这样做确实可行,但仍会带来一些样式问题块已经在其他地方定义了,我不确定何时/是否浏览器会解析动态创建的样式块? 问题答案: 浏览器支持已得到很大改进(支持所有浏览器,包括I

  • 主要内容:1 Java8 方法引用的介绍,2 Java8 方法引用的分类,3 Java8 方法引用:引用静态方法,4 Java8 方法引用:引用实例方法,5 Java8 方法引用:引用构造方法1 Java8 方法引用的介绍 Java提供了一个新功能,称为Java 8中的方法引用。方法引用用于引用功能接口的方法。它是lambda表达式的紧凑和简单形式。每次使用lambda表达式仅引用方法时,都可以将lambda表达式替换为方法引用。在本教程中,我们将详细解释方法参考概念。 2 Java8 方法引用

  • 本文向大家介绍使用Java8中的方法引用来引用实例方法,包括了使用Java8中的方法引用来引用实例方法的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式使您可以将功能作为参数传递给方法。您也可以使用lambda表达式调用现有方法。 方法引用是简单,易于阅读的lambda表达式,可通过lambda表达式中的名称来调用/引用和现有方法。 语法 以下是在Java中引用实例方法的语法

  • 就像Java 8中的(在某种程度上)与Scala的类型等价一样,是否存在与Scala的等价的类型?