美文网首页
rxjava2 map返回值空处理

rxjava2 map返回值空处理

作者: gooddaytoyou | 来源:发表于2020-07-22 11:31 被阅读0次

最近的项目升级,将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为空的时框架报错的问题。

相关文章

  • rxjava2 map返回值空处理

    最近的项目升级,将rxjava版本由1.x升级到2.x。这期间遇到一个问题,就是map返回空值。 正常的网络请求,...

  • 当 async/await 遇上 forEach

    js遍历数组常用基本就是 map,reduce,forEach,for...of map 针对是返回值处理情况,关...

  • JavaScript中forEach()、map()、some(

    forEach:没有返回值map:有返回值,把原数组经过处理后返回新数组 filter:有返回值,返回符合条件的新...

  • python 学习日记1(map,zip)

    1.map函数: map(函数,序列):将序列用函数处理. 但是有一点要注意的是函数必须有返回值才可以,不然map...

  • №11:Java异常处理

    异常 意外处理手段: 1.利用方法的特殊返回值处理意外 map.get()返回null表示每有找到 read() ...

  • RxJava2源码分析——Map操作符

    本文章主要是对RxJava2的Map操作符进行源码分析,在阅读之前,可以先阅读以下文章: RxJava2源码分析—...

  • 常用数组方法

    ① forEach没有返回值 ② map:有返回值,可以return 出来。 ③ Array.filter() 此...

  • ES6 — 数组方法

    一、forEach 循环 二、map 需要返回值,如果不给return,默认返回undefined map返回的...

  • 递归脱敏

    说明 对特定类型的返回值进行深度递归处理List > 或 Map 或是可以将JSON字符串转成对应的格式类型 递...

  • swift函数式编程日记

    map,一一遍历处理,映射为一个新的数组filter,选出条件判断返回值为true的元素 @inlinable p...

网友评论

      本文标题:rxjava2 map返回值空处理

      本文链接:https://www.haomeiwen.com/subject/olrzkktx.html