在下面的代码中,我想确认或声明地图操作符返回的对象或发射不为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()
}
}
答案 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 }