根据: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!");
}
});
Run Code Online (Sandbox Code Playgroud)
现在,我们可以:
btn.setOnAction(
event -> System.out.println("Hello World!")
);
Run Code Online (Sandbox Code Playgroud)
现在,我在使用Java库时尝试在Scala中执行此操作.
我正在使用JavaFX(Java 1.8 SE中默认包含它).尝试:
chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
Run Code Online (Sandbox Code Playgroud)
但是,我得到:
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") )
^
Run Code Online (Sandbox Code Playgroud)
旧样式很好用:
chart.setOnMouseClicked( new EventHandler[MouseEvent] {
override def handle(event: MouseEvent): Unit = println("NOT NOICE")
} )
Run Code Online (Sandbox Code Playgroud)
我在IntelliJ中将项目语言级别设置为Java 8,我使用的是Scala 2.11.1,以及来自Oracle 1.8.0_05的Java
我在这里错过了什么?或者是否根本无法将Scala中的lambda表达式传递给Java,就像在上述示例中所做的那样?
我想在我的ScalaTests中使用camunda-bpm-assert-scenario。
我在这里有以下代码receiveTask::receive:
when(documentRequest.waitsAtReceiveTask("ReceiveTaskWaitForDocuments")).thenReturn((receiveTask) -> {
receiveTask.defer("P1DT1M", receiveTask::receive);
});
Run Code Online (Sandbox Code Playgroud)
根据中的答案,是否可以在Scala中使用Java 8样式方法引用?我可以很容易地将其翻译为:
receiveTask.defer("P1D", receiveTask.receive _)
Run Code Online (Sandbox Code Playgroud)
但这给了我:
Error:(84, 45) type mismatch;
found : Unit
required: org.camunda.bpm.scenario.defer.Deferred
receiveTask.defer("P1D", receiveTask.receive _)
Run Code Online (Sandbox Code Playgroud)
这是receive功能:
void receive();
Run Code Online (Sandbox Code Playgroud)
这是预期的接口:
public interface Deferred {
void execute() throws Exception;
}
Run Code Online (Sandbox Code Playgroud)
如何在Scala中实现这一目标?这不是Scala中可以使用Java 8样式方法引用的副本吗?,则无法解决“错误:(84,45)类型不匹配; ...”
我需要处理来自 Scala 的 Java 8 流。Scala 中的Java 8 运算符相当于什么::?
// Java
IntStream.range(1, 4)
.forEach(System.out::println);
// Scala
IntStream.range(1, 4)
.forEach() // <- ???
Run Code Online (Sandbox Code Playgroud) 从Java 8开始我就可以通过了
xyz.foreach(e -> System.out.println(e));
Run Code Online (Sandbox Code Playgroud)
我可以做以下事情
xyz.foreach(System.out::println)
Run Code Online (Sandbox Code Playgroud)
错误:(16,63)对重载定义的模糊引用,
两个方法toJson在对象IanesJsonHelper中的类型(source:IanesServer)String
和方法toJson在对象IanesJsonHelper中的类型(success:Boolean)String
匹配期望类型函数[?,String]
Run Code Online (Sandbox Code Playgroud)val json = IanesJsonHelper.toJson(array,IanesJsonHelper.toJson _) ^
我有3个名为"toJSON"的函数
def toJson(id: Int): String
Run Code Online (Sandbox Code Playgroud)
和
def toJson(success: Boolean): String
Run Code Online (Sandbox Code Playgroud)
和
def toJson(source: IanesServer): String
Run Code Online (Sandbox Code Playgroud)
最后一个是正确的.
我在上面的错误消息中调用的函数是:
def toJson[T](source: Array[T], toJson: Function[T, String]): String
Run Code Online (Sandbox Code Playgroud)
这是相关代码:
val array = new Array[IanesServer](1)
array(0) = new IanesServer(1, "http://localhost:4567/", "Test")
val json = IanesJsonHelper.toJson(array,IanesJsonHelper.toJson)
Run Code Online (Sandbox Code Playgroud)
我不知道我的错误是什么:
有人可以帮助指出错误吗?目前我非常不同意,该函数是[?,String].有任何想法吗?
答:谢谢您的快速回答,这是我选择的:
IanesJsonHelper.toJson[IanesServer](array,IanesJsonHelper.toJson)
Run Code Online (Sandbox Code Playgroud)