You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:35:20