如何在Kotlin中正确实现whenCompleteAsync(BiConsumer,Executor)方法
在Kotlin中实现
whenCompleteAsync函数的正确语法 函数实现(扩展CompletableFuture)
Kotlin可以直接基于Java的CompletableFuture实现该方法,既兼容Java的BiConsumer接口,也能用Kotlin原生函数类型简化写法:
import java.util.concurrent.CompletableFuture import java.util.concurrent.Executor import java.util.function.BiConsumer // 方式1:兼容Java BiConsumer接口 fun <T> CompletableFuture<T>.whenCompleteAsync( action: BiConsumer<in T, in Throwable>, executor: Executor ): CompletableFuture<T> { return this.whenCompleteAsync(action, executor) } // 方式2:使用Kotlin函数类型更简洁 fun <T> CompletableFuture<T>.whenCompleteAsync( action: (T?, Throwable?) -> Unit, executor: Executor ): CompletableFuture<T> { val resultFuture = CompletableFuture<T>() this.whenComplete { value, throwable -> executor.execute { try { action(value, throwable) if (throwable != null) { resultFuture.completeExceptionally(throwable) } else { resultFuture.complete(value) } } catch (e: Exception) { resultFuture.completeExceptionally(e) } } } return resultFuture }
调用示例
import java.util.concurrent.Executors fun main() { val executor = Executors.newSingleThreadExecutor() val testFuture = CompletableFuture.supplyAsync { "Kotlin Async Test" } // Kotlin函数类型回调写法 testFuture.whenCompleteAsync({ value, throwable -> println("异步回调结果:$value") throwable?.let { println("捕获异常:${it.message}") } }, executor) // Java BiConsumer风格回调写法 val javaStyleAction = BiConsumer<String, Throwable> { value, throwable -> println("Java风格回调结果:$value") } testFuture.whenCompleteAsync(javaStyleAction, executor) }
语法要点说明
- Kotlin中泛型的
? super T对应in T(逆变),表示参数可接受T或其父类类型。 - Java的
BiConsumer可直接用Kotlin lambda实现,也能替换为更简洁的Kotlin函数类型(T?, Throwable?) -> Unit。 Executor是Java并发包接口,可通过Executors工具类创建线程池实例。
内容的提问来源于stack exchange,提问作者Mudit
相关产品推荐
相关产品推荐

