Как использовать оператор Maybe для проверки обнуляемости - PullRequest
1 голос
/ 09 июля 2019

В приведенном ниже коде я хочу подтвердить или подтвердить, что возвращаемый объект или излучение от оператора карты не равно нулю или если оно равно нулю - 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 ]

2 голосов
/ 10 июля 2019

RxJava не разрешит пустые значения в потоке, поэтому, если map вернет нулевое значение, поток завершится с событием ошибки.

Вместо этого вы можете заменить map на flatMapMaybe и вернуть либо Maybe.just(service), либо Maybe.empty(), если значение равно нулю. Затем вы можете утверждать, был ли результат успешным или нет в вашем subscribe обратном вызове, где onSuccess означает, что значение не было нулевым, а onComplete означает, что значение было нулевым.

Два дополнительных примечания. Возможно, вы возвращаетесь не должны быть объявлены недействительными, так как эта информация будет захвачена в самом самом Возможно. Однако я не уверен, что вам все равно нужно обрабатывать этот нулевой случай, поскольку, насколько я могу судить, retrofit.create не должен возвращать ноль в первую очередь.

1 голос
/ 10 июля 2019

Я бы порекомендовал использовать опциональную оболочку, такую ​​как Реализация гуавы

или реализовать ее простым способом, например:

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 }

...