Kotlin supplyAsync 与执行器
Kotlin supplyAsync with executor
我想创建一个具有 return 值的 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 风格。
我想创建一个具有 return 值的 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 风格。