Kotlin 引入了新类型:Result。 我用它作为几个函数的完成处理程序,如下所示:
fun myFunction(completion: (Result<Boolean>) -> Unit)
不幸的是我不能在java中使用它。 Java 不建议我使用像 getOrNull 甚至 isSuccess/isFailure 这样的 getter。
我该如何使用它? 谢谢
虽然在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;
});
}