Java 的 BiConsumer<? super T, ? super Throwable> 泛型类型的类比在 Kotlin 中将写为 BiConsumer<in T, in Throwable>。 in 关键字表示泛型类型 T 是逆变的。
这就是如何使用这样的方法签名在 Kotlin 中实现 whenCompleteAsync 函数:
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()
)