RxJava模式与原理-----map变换操作符原理

7 篇文章 0 订阅

map示意图:

在这里插入图片描述

RxJava代码

        // ObseravbleCreate  自定义source传递进去了 == source
        Observable.create(

                // 自定义source
                new ObservableOnSubscribe<String>() {
                    @Override
                    public void subscribe(ObservableEmitter<String> e) throws Exception {

                    }
                })

                //  ObseravbleCreate.map
                .map(new Function<String, Bitmap>() {
                    @Override
                    public Bitmap apply(String s) throws Exception {
                        return null;
                    }
                })

                // ObservableMap.subscribe 链式调用
                .subscribe(

                        // 自定义观察者(终点)
                        new Observer<Bitmap>() {
                            @Override
                            public void onSubscribe(Disposable d) {

                            }

                            @Override
                            public void onNext(Bitmap bitmap) {

                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onComplete() {

                            }
                        });

源码分析

.subscribe()会调用ObservableMap里面的subscribeActual函数

    @SchedulerSupport(SchedulerSupport.NONE)
    @Override
    public final void subscribe(Observer<? super T> observer) {
        ObjectHelper.requireNonNull(observer, "observer is null");
        try {
            observer = RxJavaPlugins.onSubscribe(this, observer);

            ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");

            subscribeActual(observer);
        } catch (NullPointerException e) { // NOPMD
            throw e;
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            // can't call onError because no way to know if a Disposable has been set or not
            // can't call onSubscribe because the call might have set a Subscription already
            RxJavaPlugins.onError(e);

            NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
            npe.initCause(e);
            throw npe;
        }
    }

subscribeActual(observer); 调用的是ObservableMap里面的subscribeActual函数,传入的参数是自定义观察者(观察者)
因为这是ObservableMap点出来的订阅

    @Override
    public void subscribeActual(Observer<? super U> t) {
        source.subscribe(new MapObserver<T, U>(t, function));
    }

自定义观察者(观察者) 传到 subscribeActual 后 又做了个包裹(1) new MapObserver<T, U>(t, function)
自定义观察者(观察者) 传入 MapObserver
source.subscribe (new MapObserver<T, U>(t, function)); 上一层是 ObseravbleCreate
ObseravbleCreate . subscribe 再进入ObseravbleCreate的subscribeActual

    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);
        observer.onSubscribe(parent);

        try {
            source.subscribe(parent);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            parent.onError(ex);
        }
    }

传入的observer是 自定义观察者(终点)包裹(1)
包裹(1)再被 CreateEmitter parent = new CreateEmitter(observer); 包裹成包裹(2)

observer.onSubscribe(parent); 调用第一个最先启动的函数(底端)

source.subscribe(parent); 上一层 也就是自定义source,就执行到.create()里面了(顶端)

                // 自定义source
                new ObservableOnSubscribe<String>() {
                    @Override
                    public void subscribe(ObservableEmitter<String> e) throws Exception {

                    }
                })

在.create()里面调用了包裹(2).onNext() 查看发射器中的onNext()

        @Override
        public void onNext(T t) {
            if (t == null) {
                onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
                return;
            }
            if (!isDisposed()) {
                observer.onNext(t);
            }
        }

observer.onNext(t); 又拿到了下一层的onNext
包裹(1).onNext
进入了ObservableMap里面的onNext

        @Override
        public void onNext(T t) {
            if (done) {
                return;
            }

            if (sourceMode != NONE) {
                actual.onNext(null);
                return;
            }

            U v;

            try {
                v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
            } catch (Throwable ex) {
                fail(ex);
                return;
            }
            actual.onNext(v);
        }

.apply(t) 把 类型转换接口

public interface Function<T, R> {
    /**
     * Apply some calculation to the input value and return some other value.
     * @param t the input value
     * @return the output value
     * @throws Exception on error
     */
    R apply(@NonNull T t) throws Exception;
}

真正的实现就在代码中: 它规定规则 我们来干活

                //  ObseravbleCreate.map
                .map(new Function<String, Bitmap>() {
                    @Override
                    public Bitmap apply(String s) throws Exception {
                        return null;
                    }
                })

逻辑图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

装饰模式

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RTAB-Map(Real-Time Appearance-Based Mapping)是一种基于视觉SLAM技术的实时三维环境建图算法。它可以在实时场景下对机器人的环境进行建图和定位,同时具有较好的鲁棒性和可靠性。 RTAB-Map算法的原理如下: 1. 数据获取:机器人通过激光雷达或者摄像头获取环境数据,包括点云、图像和机器人的位姿信息。 2. 特征提取和描述:对于每张图像,RTAB-Map算法会提取关键点和特征描述符,以便后续的匹配和姿态估计。 3. 点云配准:通过ICP(Iterative Closest Point)算法,将当前帧的点云与先前的点云进行配准,得到机器人的相对位姿。 4. 视觉里程计:通过对基于特征匹配的位姿估计,计算机器人在当前帧中的位姿。 5. 建图:将配准后的点云和视觉里程计获得的位姿信息融合,建立三维地图。 6. 回环检测:通过检测机器人的轨迹是否曾经走过,判断是否出现回环,如果存在回环,则进行优化,提高建图的准确性。 7. 优化:通过图优化算法,对地图的位姿和拓扑结构进行优化,提高建图的准确性和鲁棒性。 8. 地图存储:将建立好的三维地图存储在机器人的内存中,以便后续的任务使用。 RTAB-Map算法的优点在于它可以处理各种不同类型的传感器数据,并且可以在实时场景下进行建图和定位。同时,该算法还具有很好的鲁棒性和可靠性,能够在复杂环境下工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值