[英]How to provide Java callbacks (with 'void' return type), to Scala?
我在 Scala 中創建了一個庫,其中包含一個 Java API。
我想提供這樣的回調(Java):
private static void onB(Stats stats) {
//... implementation does not matter
}
Scala API 將此作為 class 參數或抽象 ZA2F2ED4F8EBC2CBB4C21A29DC40AB6 的方法
class LoggerJava(
onBatch: Stats => Unit,
)
問題是,我無法向 Scala onB
提供如上所述的 function onB。 這是需要的:
new LoggerJava(
(Stats stats) -> { onB(stats); return null; },
)
這或許是兩個不同的問題。 我最感興趣的是聽到人們在這種情況下使用的模式。 目標是庫的用戶不需要因為實現語言而采取不同的行動。
Scala 2.13 JVM 8+
如果你專門為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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.