将 Scala 函数作为 Java 函数式接口参数传递

8

我有一个Java构造函数,它以函数式接口作为参数:

public ConsumerService(QueueName queue, Consumer<T> function) {
    super(queue);
    this.function = function;
}

我尝试在Scala中使用这个构造函数,但编译器报错说无法解析构造函数。我尝试了以下方法:

val consumer = new ConsumerService[String](QueueName.CONSUME, this.process _)
val consumer = new ConsumerService[String](QueueName.PRODUCE, (s: String) => this.process(s))

我还尝试在运行时转换函数,但这会导致 ClassCastException:

val consumer = new ConsumerService[String](QueueName.CONSUME, (this.process _).asInstanceOf[Consumer[String]])

我该如何将Scala函数作为Java函数接口参数传递?

但是那里也没有真正的答案...这个问题是关于将Java util函数Consumer<T>转换为Java函数接口的标准方法。 - Alec
那是另一回事,因为没有涉及到Scala。 - Det
2个回答

13

你需要创建一个 Consumer

val consumer = new ConsumerService[String](QueueName.CONSUME, 
  new Consumer[String]() { override def accept(s: String) = process(s) })

5
另一种方式是使用以下库:

https://github.com/scala/scala-java8-compat

将其导入到您的项目中后,只需输入:

import scala.compat.java8.FunctionConverters._

现在您可以编写:

asJavaConsumer[String](s => process(s))

在您的代码中应该像这样:

val consumer = new ConsumerService[String]( QueueName.CONSUME, asJavaConsumer[String](s => process(s)) )


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接