Java转Kotlin:CompletableFuture的等价实现及使用建议咨询
Kotlin中CompletableFuture的替代方案与使用建议
直接保留CompletableFuture完全可行
Kotlin和Java完全兼容,你完全可以继续在Kotlin代码中使用CompletableFuture,IntelliJ转换后的代码可以正常工作,转换后的Kotlin版本大致如下:
fun updateAsync( sqlStatement: String, psPreparer: SQLConsumer<PreparedStatement> ): CompletableFuture<Int> = CompletableFuture.supplyAsync( { update(sqlStatement, psPreparer) }, threadPool )
注:Kotlin默认参数非空,无需显式写@NotNull;UncheckedSQLException属于运行时异常,Kotlin不需要声明throws。
Kotlin原生等价实现:协程
如果想改用Kotlin风格的异步方案,协程是最优选择,而且可以做到几乎无重构成本:
- 先把你的线程池转换成协程调度器:
val dispatcher = threadPool.asCoroutineDispatcher() - 用协程
async函数实现异步逻辑,若要兼容原有调用方,可以将Deferred(协程的异步结果类型)转为CompletableFuture:
这样既用了Kotlin原生协程的简洁写法,又不需要修改任何调用该方法的代码,实现平滑过渡。fun updateAsync( sqlStatement: String, psPreparer: SQLConsumer<PreparedStatement> ): CompletableFuture<Int> = CoroutineScope(dispatcher).async { update(sqlStatement, psPreparer) }.asCompletableFuture()
总结
- 若不想改动现有代码结构,直接保留
CompletableFuture没有任何问题,Kotlin对Java并发API的支持很完善。 - 若想拥抱Kotlin原生异步方案,协程是更符合Kotlin风格的选择,且通过
asCompletableFuture()/CompletableFuture.await()可以轻松和原有的CompletableFuture代码互操作,无需大量重构。
内容的提问来源于stack exchange,提问作者Eugine Francis
相关产品推荐
相关产品推荐

