kotlin - Kotlin supplyAsync 与 executor
问题描述
我想创建一个 CompletableFuture,其返回值在 Kotlin 中的特定执行程序上运行。
下面的代码工作得很好。
return CompletableFuture.supplyAsync {
val commandHandler = registry.get<TCommand, TResponse>(command::class.java)
commandHandler.handle(command)
}
但是,当我尝试通过执行程序时,它不会编译。
return CompletableFuture.supplyAsync({
val commandHandler = registry.get<TCommand, TResponse>(command::class.java)
commandHandler.handle(command)
}, exec)
我试图变得聪明并编写 Java 版本,并让 Intellij 将其转换为 Kotlin,但那个版本也有同样的错误。我在这里做错了什么?
编辑:
我可以通过执行以下操作使其工作,但似乎没有必要。有人可以解释为什么这有效,但其他方法无效。还有其他方法可以编写此代码吗?
return CompletableFuture.supplyAsync(Supplier {
commandHandler.handle(command)
}, exec)
解决方案
我不完全知道,为什么它不起作用。但以下确实有效:
return CompletableFuture.supplyAsync({
val commandHandler = registry.get<TCommand, TResponse>(command::class.java)
commandHandler.handle(command)
}, exec::execute)
如您所见,我将第二个参数更改为方法引用。现在该方法的签名是:
supplyAsync(supplier: () -> U, executor: (Runnable)-> Unit)
如果直接传递 Executor,Kotlin 会选择签名:
supplyAsync(supplier: Supplier<U>, executor: Executor)
看起来你不能混合界面和 lambda 风格。
推荐阅读
- amazon-redshift - 如何检查 Redshift 维护时段
- next.js - 在 Next.js 项目中的 Tailwind 中配置颜色会破坏所有颜色
- vuejs2 - Vue 2 和 Video.js 在视频播放时暂停视频
- c# - SQL Server 中的 NEXT VALUE FOR @Sequence 的工作方式是否与 C# 中的 Interlocked.Increment() 相同?
- electron - 命令失败,无法获取本地颁发者证书
- angular - 谷歌图表:错误类型错误:“c 未定义”
- html - 如何在模板中获取按钮来更改模型?姜戈
- c# - 我试图在 C# 控制台中制作一个计算器
- flutter - 文本小部件不会居中
- r - 如何根据第二个数据帧中的外观保留一个数据帧中的数据?