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

相关推荐
xiangpanf9 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx12 小时前
安卓线程相关
android
消失的旧时光-194312 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon13 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon13 小时前
VSYNC 信号完整流程2
android
dalancon13 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户693717500138414 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android15 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才15 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶16 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle