RxJava 复刻简版之三,map 多次中转数据

案例代码:https://gitee.com/bobidali/lite-rx-java/commit/292e9227a5491f7ec6a07f395292ef8e6ff69290

RxJava 的调用第一步是封装了观察者接受了数据的处理,进一步就是使用 map 将数据操作传递给上下游

1、类似Observer.create 创建一个简单的观察者

java 复制代码
abstract class Single<T> : SingleSource<T> {
    companion object {
        @JvmStatic
        fun <T> just(item: T): Single<T> {
            return RxJavaPlugins.onAssembly(SingleJust(item))
        }
    }

    override fun subscribe(observer: SingleObserver<in T>) {
        Objects.requireNonNull(observer, "observer is null")

        try {
            var obsv = observer
            obsv = RxJavaPlugins.onSubscribe(this, obsv)
            subscribeActual(obsv)
        } catch (e: NullPointerException) {
            throw e
        } catch (e: Throwable) {
            throw NullPointerException("subscribeActual failed").initCause(e)
        }
    }

    protected abstract fun subscribeActual(observer: SingleObserver<in T>)
}
java 复制代码
class SingleJust<T>(private val value: T) : Single<T>() {
    override fun subscribeActual(observer: SingleObserver<in T>) {
        observer.onSubscribe(Disposable.disposed())
        observer.onSuccess(value)
    }
}

2、在SingleObserver 中加入map 方法实现数据的承上启下

java 复制代码
    fun <R> map(mapper: com.example.literj.kt.internal.functions.Function<in T, out R>): Single<R> {
        Objects.requireNonNull(mapper, "mapper is null")
        return RxJavaPlugins.onAssembly(SingleMap(this, mapper))
    }
java 复制代码
class SingleMap<T, R>(
    private val source: SingleSource<out T>,
    private val mapper: Function<in T, out R>
) : Single<R>() {
    override fun subscribeActual(observer: SingleObserver<in R>) {
        source.subscribe(MapSingleObserver(observer, mapper))
    }

    internal class MapSingleObserver<T, R>(
        private val t: SingleObserver<in R>,
        private val mapper: Function<in T, out R>
    ) : SingleObserver<T> {
        override fun onSuccess(t: T) {
            val v: R
            try {
                v = Objects.requireNonNull(
                    mapper.apply(t),
                    "The mapper function returned a null value."
                )
            } catch (e: Throwable) {
                onError(e)
                return
            }
            this.t.onSuccess(v)
        }

        override fun onSubscribe(d: Disposable) {
            t.onSubscribe(d)
        }

        override fun onError(e: Throwable) {
            t.onError(e)
        }
    }
}

3、铛铛,完成,看看调用案例

java 复制代码
    public static void sample3() {
        String tag = "sample3";
        Log.d(TAG + " " + tag, "start");
        Single.just(777).map(data1 -> 777).map(data2 -> 888).subscribe(getSingleObserver(tag));
    }
java 复制代码
2023-08-13 11:58:23.703 21522-21522/com.example.literj D/RxJavaTestUtil sample3: start
2023-08-13 11:58:23.713 21522-21522/com.example.literj D/RxJavaTestUtil sample3: onSubscribe
2023-08-13 11:58:23.713 21522-21522/com.example.literj D/RxJavaTestUtil sample3: onSuccess = 888

ok,那么下一篇就加入线程切换

相关推荐
TDengine (老段)3 小时前
TDengine 转换函数 TO_JSON 用户手册
android·大数据·数据库·json·时序数据库·tdengine·涛思数据
q***42823 小时前
SpringCloudGateWay
android·前端·后端
卫生纸不够用3 小时前
Appium-锁屏-Android
android·appium
阿拉斯攀登4 小时前
安卓工控机 OTA 升级方案(SpringBoot+MQTT)
android·spring boot·物联网·iot
顾林海4 小时前
从0到1搭建Android网络框架:别再让你的请求在"路上迷路"了
android·面试·架构
花花鱼5 小时前
android room中实体类变化以后如何迁移
android
Jomurphys5 小时前
设计模式 - 适配器模式 Adapter Pattern
android
雨白5 小时前
电子书阅读器:解析 EPUB 底层原理与实战
android·html
g***B7385 小时前
Kotlin协程在Android中的使用
android·开发语言·kotlin
A***27956 小时前
Kotlin反射机制
android·开发语言·kotlin