如何向Scala提供Java回调(返回类型为';void')?

如何向Scala提供Java回调(返回类型为';void')?,java,scala,language-interoperability,Java,Scala,Language Interoperability,我用Scala制作了一个库,它有一个JavaAPI 我想提供这样一个回调(Java): Scala API将其作为类参数或抽象类的方法 class LoggerJava( onBatch: Stats => Unit, ) 问题是,我不能像上面那样为Scala API提供函数onB。这是必要的: new LoggerJava( (Stats stats) -> { onB(stats); return null; }, ) 这可能是两个不同的问题。我最感兴趣的是听到人们

我用Scala制作了一个库,它有一个JavaAPI

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

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

class LoggerJava(
  onBatch: Stats => Unit,
) 
问题是,我不能像上面那样为Scala API提供函数
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))

如果您专门为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))

解决这个问题,但是他们的用例比我的复杂得多。另外,它们来自于Scala 2.13之前的版本。新LoggerJava(ClassName::onB)的错误是什么?解决这个问题,但是他们的用例比我的复杂得多。另外,它们来自于Scala 2.13之前的版本。新LoggerJava(ClassName::onB)的错误是什么?