相关疑难解决方法(0)

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

根据: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,就像在上述示例中所做的那样?

lambda scala javafx java-8 javafx-8

19
推荐指数
2
解决办法
6088
查看次数

如何将Java双冒号运算符(::)转换为Scala?

我想在我的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)类型不匹配; ...”

java lambda scala scala-java-interop camunda

6
推荐指数
1
解决办法
96
查看次数

Scala 相当于 Java 8 ::(双冒号)运算符

我需要处理来自 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 scala

5
推荐指数
1
解决办法
1974
查看次数

在Scala中传递函数

从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]

 val json = IanesJsonHelper.toJson(array,IanesJsonHelper.toJson _)

                                                        ^
Run Code Online (Sandbox Code Playgroud)

我有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)

我不知道我的错误是什么:

  1. 该数组的类型为IanesServer
  2. 调用方法中的T应该是IanesServer(Array [IanesServer] - > Array [T]
  3. 由于2.函数中的T必须与数组中的T相同,因此必须是函数[IanesServer,String] - > Function [T,String]

有人可以帮助指出错误吗?目前我非常不同意,该函数是[?,String].有任何想法吗?

答:谢谢您的快速回答,这是我选择的:

 IanesJsonHelper.toJson[IanesServer](array,IanesJsonHelper.toJson)
Run Code Online (Sandbox Code Playgroud)

java generics scala java-8

4
推荐指数
1
解决办法
150
查看次数