让 Java 消费者接受 Kotlin lambda

Make Java Consumer accept Kotlin lambda

这可能是一个奇怪的问题,但我想知道是否有人对此有一些想法。 我正在开发一种我们希望与 Java、Groovy 和 Kotlin 兼容的 DSL。我正在将 Kotlin 兼容性添加到当前代码库中,尝试尽可能少地重复。除了使用 Java 消费者功能接口在 Groovy 中编写的一段代码外,它运行良好:

PromptOptionals prompts(Consumer<PromptOptionals> definition) {
  DefaultPromptOptionals promptOptionals = new DefaultPromptOptionals()
  definition.accept(promptOptionals)
  prompts = promptOptionals.prompts
  promptOptionals
}

可以从 Java/Groovy 调用此 prompts() 方法很好,但是当我用 Kotlin 调用它时:

prompts {
  say("test")
  pause(10)
  play("http://someserver.com/file")
}

将 say、pause 和 play 这 3 个方法调用添加到列表中 promptOptionals.prompts,一切都按预期进行。但是对于 Kotlin,当 definition.accept(promptOptionals) 被调用时,方法永远不会添加到列表中,返回的 promptOptionals 变量只是空的。 有什么方法可以使 Consumer 与 Kotlin lambda 兼容?

当然我对你的 api 没有信心,但对我来说,忽略 lambda 的参数看起来很奇怪。你可能应该这样写:

prompts { prompt ->
  prompt.say("test")
  prompt.pause(10)
  prompt.play("http://someserver.com/file")
}