Is it possible to use a Java 8 style method references in Scala?
If you want a method reference that also takes the class instance as a parameter, for instance like String::length
in Java, you can do (_:String).length
which is equivalent to (s:String) => s.length()
.
The types of these are in Java Function<String, Integer>
and in Scala thus String => Int
.
You should pass function which applying one parameter of type ActionEvent
:
val button = new Button()
val inputController = new InputController()
def handler(h: (ActionEvent => Unit)): EventHandler[ActionEvent] =
new EventHandler[ActionEvent] {
override def handle(event: ActionEvent): Unit = h(event)
}
button.setOnAction(handler(inputController.handleFileSelection))
inputController::handleFileSelection
is Java syntax, which isn't supported or needed in Scala because it already had a short syntax for lambdas like this: inputController.handleFileSelection _
or inputController.handleFileSelection(_)
(inputController.handleFileSelection
can also work, depending on the context).
However, in Java you can use lambdas and method references when any SAM (single abstract method) interface is expected, and EventHandler
is just such an interface. In Scala before version 2.11 this isn't allowed at all, in 2.11 there is experimental support for using lambdas with SAM interfaces, which has to be enabled using -Xexperimental
scalac flag, and starting from 2.12 it is fully supported and doesn't need to be enabled.