【问题标题】:How to provide Java callbacks (with 'void' return type), to Scala?如何向 Scala 提供 Java 回调(具有“void”返回类型)?
【发布时间】:2020-10-20 14:26:40
【问题描述】:

我在 Scala 中创建了一个具有 Java API 的库。

我想提供这样一个回调(Java):

private static void onB(Stats stats) {
   //... implementation does not matter
}

Scala API 将 this 作为类参数或抽象类的方法。

class LoggerJava(
  onBatch: Stats => Unit,
) 

问题是,我不能像上面那样向 Scala API 提供函数 onB。这是必需的:

new LoggerJava(
  (Stats stats) -> { onB(stats); return null; },
)

这可能是两个不同的问题。我最感兴趣的是听到人们在这种情况下使用的模式。目标是库的用户不需要因为实现语言而采取不同的行动。

斯卡拉 2.13 JVM 8+

【问题讨论】:

标签: java scala language-interoperability


【解决方案1】:

如果你提供专门针对Java的API,就使用JDK的Java功能接口即可。

import java.util.function.Consumer

class LoggerJava(
  onBatch: Consumer[Stats],
)

如果您的 Java API 需要与使用 Scala 函数的代码交互,您可以轻松地转换它们。

import scala.jdk.FunctionConverters._

private val scalaApi = new LoggerScala(onBatch.asScala)

另一种方法是 Java API 的用户必须转换他们所有的 lambda。例如

import scala.jdk.javaapi.FunctionConverters

new LoggerJava(FunctionConverters.asScalaFromConsumer(ClassName::onB))

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多