【问题标题】:Pass scala function as java functional interface argument将 scala 函数作为 java 函数接口参数传递
【发布时间】:2016-11-22 18:32:50
【问题描述】:

我有一个 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 scala functional-programming


【解决方案1】:

你需要创建一个Consumer:

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

【讨论】:

    【解决方案2】:

    另一种方法是使用以下库:

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

    导入后在您的项目中使用:

    import scala.compat.java8.FunctionConverters._

    你现在可以写了:

    asJavaConsumer[String](s =&gt; process(s))

    你的代码应该是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 2020-05-13
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多