让 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")
}
这可能是一个奇怪的问题,但我想知道是否有人对此有一些想法。 我正在开发一种我们希望与 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")
}