如何使用Maybe运算符检查可空性

时间:2019-07-09 19:09:09

标签: android kotlin observable rx-java rx-java2

在下面的代码中,我想确认或声明地图操作符返回的对象或发射不为null或为null-应该返回empty()。 请让我知道它是否正确。

活动

companion object {
    fun create(): Maybe<WikiApiService>? {
        return Single.just(
            Retrofit.Builder()
                .addCallAdapterFactory(
                    RxJava2CallAdapterFactory.create()
                )
                .addConverterFactory(
                    GsonConverterFactory.create()
                )
                .baseUrl("https://en.wikipedia.org/w/")
                .build()
        )
            .map { retrofit -> retrofit.create(WikiApiService::class.java) }
            .toMaybe()
            //.toObservable()
    }
}

2 个答案:

答案 0 :(得分:2)

RxJava不允许在流内部包含null,因此,如果map返回null,则该流将因错误事件而终止。

您可以做的是将map替换为flatMapMaybe,如果该值为空,则返回Maybe.just(service)Maybe.empty()。然后,您可以在subscribe回调中断言结果是否成功,其中onSuccess表示该值不为空,而onComplete表示该值为空。

另外两个注释。您可能要返回的对象不必声明为可为空,因为该信息将在Maybe本身内部捕获。但是,我不确定您是否仍需要处理此空值,因为据我所知,retrofit.create不应首先返回空值。

答案 1 :(得分:1)

我建议使用Guava implementation

这样的可选包装器

或通过以下简单方式实现它:

class Optional<T>(private val value: T? = null) {

    fun getValue(): T {
        if (value != null) {
            return value
        } else {
            throw ValueUnavailableException(this.logTag())
        }
    }

    private inline fun <reified T> T.logTag() = T::class.java.simpleName

    fun toNullable(): T? = this.value

    fun hasValue(): Boolean {
        return value != null
    }
    class ValueUnavailableException(className: String = "") : Exception("The optional value for $className is null")
}

在流使用中,使用


.filter { optionalObject --> objectionalObject.toNullable() != null }