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,那么下一篇就加入线程切换

相关推荐
阿巴斯甜8 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker8 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95279 小时前
Andorid Google 登录接入文档
android
黄林晴10 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android