rxjava2 map返回值空处理

2020-07-22  本文已影响0人  gooddaytoyou

最近的项目升级,将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<String>()
            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<String>(),这样保证可以调用filter,在filter中增加过滤规则,可以保证rxjava不报错。

concatMap 实例

Observable.just("1", "2")
                .concatMap { s ->
                    Observable.just(s).map {
                        if (it == "1") Observable.empty<String>()
                        else Bean("1", "test")
                    }
                }
                .filter {
                    println("filter$it")
                    it is Bean
                }
                .toList()
                .subscribe(object : SingleObserver<List<Any?>> {

                    override fun onSubscribe(d: Disposable) {
                    }

                    override fun onError(e: Throwable) {
                        println(e)
                    }

                    override fun onSuccess(t: List<Any?>) {
                        println("onSuccess${t as List<Bean>}")
                    }
                })
 class Bean(private val id: String, private val name: String) {
        override fun toString(): String {
            return "id:$id ,name:$name"
        }
    }

可以看到,采用这种方法,可以完美解决rxjava2,map为空的时框架报错的问题。

上一篇 下一篇

猜你喜欢

热点阅读