java 中的 Kotlin 结果类型

问题描述 投票:0回答:2

Kotlin 引入了新类型:Result。 我用它作为几个函数的完成处理程序,如下所示:

fun myFunction(completion: (Result<Boolean>) -> Unit)

不幸的是我不能在java中使用它。 Java 不建议我使用像 getOrNull 甚至 isSuccess/isFailure 这样的 getter。

我该如何使用它? 谢谢

java kotlin callback
2个回答
3
投票

Java 中没有对

Result
等类型的标准支持,但您始终可以使用第三方库,例如
HubSpot/algebra


0
投票

虽然在java中无法直接获取kotlin.Result,但是可以使用以下方法获取:

/**
 * ResultCompat.
 *
 * It is intended to solve the problem of being unable to obtain [kotlin.Result] in java.
 */
class ResultCompat<T>(val result: Result<T>) {

    companion object {
        /**
         * Returns an instance that encapsulates the given [value] as successful value.
         */
        fun <T> success(value: T): ResultCompat<T> = ResultCompat(Result.success(value))

        /**
         * Returns an instance that encapsulates the given [Throwable] as failure.
         */
        fun <T> failure(throwable: Throwable): ResultCompat<T> =
            ResultCompat(Result.failure(throwable))
    }

    /**
     * Returns `true` if [result] instance represents a successful outcome.
     * In this case [ResultCompat.isFailure] return `false` .
     */
    val isSuccess: Boolean
        get() = result.isSuccess

    /**
     * Returns `true` if [result] instance represents a failed outcome.
     * In this case [ResultCompat.isSuccess] returns `false`.
     */
    val isFailure: Boolean
        get() = result.isFailure

    /**
     * @see Result.getOrNull
     */
    fun getOrNull(): T? = result.getOrNull()

    /**
     * @see Result.exceptionOrNull
     */
    fun exceptionOrNull(): Throwable? = result.exceptionOrNull()

    override fun toString(): String =
        if (isSuccess) "ResultCompat(value = ${getOrNull()})"
        else "ResultCompat(error = ${exceptionOrNull()?.message})"
}

在*.kt文件中

fun myFunction(completion: (ResultCompat<String>) -> Unit){
    val result = ResultCompat.success("This is a test.")
    completion(result)
}

在*

.java
中使用myFunction

void myFunction(){
    myFunction(result -> {
        // You should not get result in java.
        result.getResult();
        // correctly
        result.exceptionOrNull();
        result.getOrNull();
        result.isSuccess();
        result.isFailure();
        return null;
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.