簡體   English   中英

如何向 Scala 提供 Java 回調(返回類型為 'void')?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM