当completeasync(消费者,执行者)的Kotlin语法



如何在Kotlin中实现以下方法签名的函数。我正面临着语法正确的问题。

public CompletableFuture<T> whenCompleteAsync(
BiConsumer<? super T, ? super Throwable> action, Executor executor)

类似于Java的BiConsumer<? super T, ? super Throwable>泛型类型将在Kotlin中写成BiConsumer<in T, in Throwable>in关键字表示泛型T为逆变型

这是whenCompleteAsync函数在Kotlin中如何使用这样的方法签名实现的:

fun <T> whenCompleteAsync(
action: BiConsumer<in T, in Throwable>, 
executor: Executor
): CompletableFuture<T> {
val future = CompletableFuture<T>()
executor.execute {
try {
val result = future.get()
action.accept(result, null)
} catch (e: Throwable) {
action.accept(null, e)
}
}
return future
}

用法:

val future = whenCompleteAsync(
BiConsumer { result, ex ->
if (ex != null) {
// Handle exception
} else {
// Handle result
}
},
Executors.newSingleThreadExecutor()
)

在Kotlin中不需要使用BiConsumer接口,除非出于某种原因需要。相反,可以使用带有两个参数的Kotlin函数并简化示例:

fun <T> whenCompleteAsync(
action: (T?, Throwable?) -> Unit,
executor: Executor
): CompletableFuture<T> {
val future = CompletableFuture<T>()
executor.execute {
try {
val result = future.get()
action(result, null)
} catch (e: Throwable) {
action(null, e)
}
}
return future
}
val future = whenCompleteAsync(
{ result, ex ->
if (ex != null) {
// Handle exception
} else {
// Handle result
}
},
Executors.newSingleThreadExecutor()
)

最新更新