RxJava操作符之map&flatmap

RxJava中文文档链接

map操作符属于变换操作符,它的作用将被观察者Observable发送的数据应用一个函数进行变换操作,然后将变换后的数据发送给观察者Observer。

参考官方图例,上层被观察者发送一系列数据经过map操作符转换为另一种类型数据然后依次发送给下层观察者。

RxJava操作符之map&flatmap_第1张图片

假设一个界面上有一个EditText,一个TextView,在EditText中输入学号,然后通过这个学号从后台查找到这个学号对应学生的名字。这个时候可以用到这个map操作符。

private void mapfunction(final View view) {
    Observable observable = Observable.create(
        new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                e.onNext(1000);
            }
        });
    observable.observeOn(Schedulers.io())  //这一步指定了下面map操作符调用的Function的apply函数执行的线程
            .map(new Function() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        //integer是observable传过来的学号,假设这里已经从后台查到了对应的学生名称
                        String name = integer.toString();
                        return "student name is:" + name;
                    }})
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer() {
                    @Override
                    public void accept(String s) throws Exception {
                        ((TextView)view.findViewById(R.id.tv)).setText(s);
                    }
            });
}

这里observable调用map函数,传入参数new Function实例,它的两个泛型类型,第一个表示被观察者Observable传过来的数据类型,第二个表示传给观察者的数据类型,即apply()函数返回值得数据类型。

flatmap操作符也是变换操作符,他的作用官方解释是将一个发送数据的被观察者Observable变换为多个发送数据的被观察者Observable,然后将他们合并为一个Observable,用这个合并后的被观察者Observable发送数据给观察者Observer。

我们实际开发中可以这么理解Observable发送一个数据,flatmap操作符拦截了这个数据后,将这个数据转换为多个数据,然后将这些数据创建一个新的Observable,然后发送数据给Observer。

参考官方图例,上层被观察者发送一个数据经过flatmap操作符转换为多个数据,然后依次发送给下层观察者。

RxJava操作符之map&flatmap_第2张图片

假设我们获取了一个学生的名字,然后想获取这个学生报名的课程信息,对这些课程信息做处理的时候就可以用到flatmap操作符

private void flatMapFunction(View view) {
        Observable observable = Observable.create(new 
        ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                Log.d(TAG, "Observable in thread:" + Thread.currentThread().getName());
                e.onNext("Tom");
                e.onComplete();
            }
        });
        observable.observeOn(Schedulers.io())
                .flatMap(new Function>() {
                    @Override
                    public ObservableSource apply(String s) throws Exception {
                        //假设这里已经从后台获取到课程信息,然后存入list
                        List list = new ArrayList<>();
                        list.add(s + " first lesson is: English.");
                        list.add(s + " second lesson is: Math.");
                        list.add(s + " third lesson is: History.");
                        Log.d(TAG, "current time is:" + System.currentTimeMillis() +
                                ". flatMap in thread:" + Thread.currentThread().getName());
                        //这里将这个list作为参数创建一个Observable,delay表示延时100毫秒将数据发送给观察者Observer
                        return Observable.fromIterable(list).delay(100, TimeUnit.MILLISECONDS);
                    }
                }).observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.d(TAG, "onNext! " + s + " now time is:" + System.currentTimeMillis() +
                                ". observer in thread:" + Thread.currentThread().getName());
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete!");
                    }
                });
    }

这里的flatmap函数同样传入参数Function实例,区别map操作符的是它的第二个泛型类型固定是Observable,Observable实现接口ObservableSource。

示例代码链接

你可能感兴趣的:(RxJava)