Kotlin supplyAsync with executor

标签 kotlin completable-future

我想创建一个 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,但那个也有同样的错误。我在这里做错了什么?

enter image description here

编辑:

我可以通过执行以下操作使其工作,但似乎没有必要。有人可以解释为什么这有效但其他方法无效。还有其他方法可以编写此代码吗?
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 风格。

关于Kotlin supplyAsync with executor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54301518/

相关文章:

android - 如何使用kotlin在 Dagger 中生成包含@ContributesAndroidInjector的模块?

android - Room - SELECT 查询、获取或默认

java - 这个错误是什么意思以及我的代码有什么问题?

java - Android ComputableFuture 无法与 Firestore 配合使用

java-native-interface - Kotlin 原生接口(interface)

Spring Autowire Hashmap 在 kotlin 中不起作用

kotlin - 正确的互斥方式

java - 如何使 java.util.concurrent.Future 失败

java - 如何在 CompletableFuture.get() 调用上引发异常?

java - CompletableFuture,main 永远不会退出