概述
最近的项目升级,将rxjava版本由1.x升级到2.x。这期间遇到一个问题,就是map返回空值。
正常的网络请求,有时候可能要求,一个请求完之后,再发起另一个请求,两者的返回结果是一样的,但是如果其中一个请求为空,另一个不为空,不影响程序的正常运行。
我们先模拟个例子
Observable.just("1","2").map {
if (it == "1") null
else it
}.subscribe {
println(it)
}
运行结果
io.reactivex.exceptions.OnErrorNotImplementedException: The mapper function returned a null value.
rxjava的框架内部报错,影响正常的输出。
null过滤掉
那我们怎样将空值过滤掉呢?用filter函数。
Observable.just("1","2").map {
if (it == "1") null
else it
}.filter {
it != null
}.subscribe {
println(it)
}
运行结果,和上面的一样,说明,filter的条件没有走。
那进一步思考,如何在map返回null的时候,可以进入到filter函数。
null替换成另一种类型
Observable.just("1", "2").map {
if (it == "1") Observable.empty()
else it
}.filter {
println("filter:$it")
it is String
}.subscribe {
println(it as String)
}
运行结果
filter:io.reactivex.internal.operators.observable.ObservableEmpty@7946e1f4
filter:2
2
这里采用的是,当返回为null时,将其替换为Observable.empty(),这样保证可以调用filter,在filter中增加过滤规则,可以保证rxjava不报错。
concatMap 实例
Observable.just("1", "2")
.concatMap { s ->
Observable.just(s).map {
if (it == "1") Observable.empty()
else Bean("1", "test")
}
}
.filter {
println("filter$it")
it is Bean
}
.toList()
.subscribe(object : SingleObserver> {
override fun onSubscribe(d: Disposable) {
}
override fun onError(e: Throwable) {
println(e)
}
override fun onSuccess(t: List) {
println("onSuccess${t as List}")
}
})
class Bean(private val id: String, private val name: String) {
override fun toString(): String {
return "id:$id ,name:$name"
}
}
可以看到,采用这种方法,可以完美解决rxjava2,map为空的时框架报错的问题。
最后
以上就是坚定宝马为你收集整理的java map 返回值_rxjava2 map返回值空处理的全部内容,希望文章能够帮你解决java map 返回值_rxjava2 map返回值空处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复