如何从Kotlin挂起函数获取Future并执行转换操作?
Kotlin协程中挂起函数与Future/Deferred的转换说明
首先明确:Kotlin协程的async函数返回的是Deferred<T>类型,而非Java标准库的Future<T>。不过两者可互相转换,针对你的需求分情况说明:
1. 直接基于Deferred做结果转换
如果只是想对挂起函数的结果做转换,完全不需要转成Future,Deferred本身就能支持相关操作:
val respDeferred = async { method(request) } // 等待结果后同步转换 val transformedResult = respDeferred.await().let { /* 你的转换逻辑 */ } // 或者异步执行转换,返回新的Deferred val transformedDeferred = async { respDeferred.await().let { /* 你的转换逻辑 */ } }
2. 转换为Java CompletableFuture并操作
如果一定要拿到Java的Future类型,可借助kotlinx-coroutines-jdk8依赖中的asCompletableFuture()扩展方法,将Deferred转为CompletableFuture<T>——它支持thenApply()方法实现类似你想要的map转换逻辑:
import kotlinx.coroutines.async import kotlinx.coroutines.future.asCompletableFuture val respFuture = async { method(request) }.asCompletableFuture() val transformedFuture = respFuture.thenApply { /* 你的转换函数 */ }
3. 你代码中的问题说明
你写的val respFuture: Future = async { method(request) }会编译报错,因为async返回的Deferred和JavaFuture并非同一类型,必须通过asCompletableFuture()转换才能得到符合类型要求的Future实例。另外,标准JavaFuture接口本身并没有map方法,只有CompletableFuture才提供这类链式转换能力。
内容的提问来源于stack exchange,提问作者Dean Hiller
相关产品推荐
相关产品推荐

