【问题标题】:Kotlin Syntax for whenCompleteAsync(BiConsumer,Executor)whenCompleteAsync(BiConsumer,Executor) 的 Kotlin 语法
【发布时间】:2022-12-20 01:41:30
【问题描述】:

如何在 Kotlin 中为以下方法签名实现一个函数。我在获取语法正确方面遇到了问题。

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

【问题讨论】:

    标签: java kotlin syntax completable-future


    【解决方案1】:

    Java 的 BiConsumer&lt;? super T, ? super Throwable&gt; 泛型类型的类比在 Kotlin 中将写为 BiConsumer&lt;in T, in Throwable&gt;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()
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多