RxJava 操作符map

RxJava系列教程:

1. RxJava使用介绍 【视频教程】
2. RxJava操作符
  • Creating Observables(Observable的创建操作符) 【视频教程】
  • Transforming Observables(Observable的转换操作符) 【视频教程】
  • Filtering Observables(Observable的过滤操作符) 【视频教程】
  • Combining Observables(Observable的组合操作符) 【视频教程】
  • Error Handling Operators(Observable的错误处理操作符) 【视频教程】
  • Observable Utility Operators(Observable的辅助性操作符) 【视频教程】
  • Conditional and Boolean Operators(Observable的条件和布尔操作符) 【视频教程】
  • Mathematical and Aggregate Operators(Observable数学运算及聚合操作符) 【视频教程】
  • 其他如observable.toList()、observable.connect()、observable.publish()等等; 【视频教程】
3. RxJava Observer与Subcriber的关系 【视频教程】
4. RxJava线程控制(Scheduler) 【视频教程】
5. RxJava 并发之数据流发射太快如何办(背压(Backpressure)) 【视频教程】


map名词是地图的意思,那么这样理解这个操作符就很想不通这个操作符的 应用场景了,但我们敲代码的不可能不熟悉这一个数据结构.

在我使用这个操作符的理解中,map就是变换需要操作的数据内容或者结构的意思。所以其使用场景显而易见:当原始数据不能满足我们的需求,但我们却需要依赖这一原始数据去获取满足我们需求的数据时,那么就用它,准没错。

假如有下面场景:

我有一个图片url集合,但我的需求却是依次获取到bitmap,显示在ImageView中,那么用该操作符就能解决问题了

官方文档原文:
transform the items emitted by an Observable by applying a function to each item.

我的理解:
通过使用map中的方法对Observable中发射出来的所有数据进行变换.(翻译如有错误,望指正)
ReactiveX 官方文档-map

ReativeX map操作符的流程示意图

下面通过一段伪代码理解下。

Observable
.from(filePathStrS)// String[] filePathStrS :本地图片路径数组 
.map(new Func1<String, Bitmap>() {
    @Override
    public Bitmap call(String s) {
        return Utils.getBitmapFromFile(photoPath + s);//通过map将String变换成Bitmap
    }
})
.filter(new Func1<Bitmap, Boolean>() {
    @Override
    public Boolean call(Bitmap bitmap) {
        return bitmap != null;//筛选掉空文件
    }
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
    @Override
    public void call(Bitmap bitmap) {//主线程显示数据
        questionBitmapList.set(questionInPicCount, bitmap);
        QuestionShowAdapter.notifyDataSetChanged();

    }
}, new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {
        throwable.printStackTrace();
    }
}, new Action0() {
    @Override
    public void call() {
    }
});

另一种理解:map操作符的作用就是将一个事件转换成另一个事件

举个例子, 比如说: 服务器现在返回了一段字符串,我需要将字符串重新拼接成新的字符串,并加载数据。

这时,我们就可以通过map操作。

Observable.just(url).map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                return "http://www.baidu.com/" + s;
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                mTextView.setText(s);
            }
        });
        //如果你有lamdba
        Observable.just(url).map(f -> "http://www.baidu.com/" + f).subscribe(t -> mTextView.setText(t));

map操作符的特点是: 你传递一个Observable对象给他, 他返回你一个Observable对象, 但是不需要对应Observable的返回类型。

这里写图片描述

举个例子: 每个模块传递一个url给底层网络请求您框架, 然后底层框架需要将url进行变换, 比如: 添加host。 那么我们就可以通过map来实现。

public static final String HOST = "http://blog.csdn.net/";

    @Bind(R.id.first_wb)
    WebView mWb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Observable.just("jys1115/article/details/47428843").map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                return HOST + s;
            }
        }).map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                return doNetTask(s);
            }
        }).subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        mWb.loadDataWithBaseURL(HOST, s, "text/html", "utf-8", null);
                    }
                });
    }

    private String doNetTask(String s) {

        HttpClient client = new DefaultHttpClient();

        HttpGet get = new HttpGet(s);
        String result;
        try {
            HttpResponse response = client.execute(get);

            if (200 == response.getStatusLine().getStatusCode()) {
                result = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
            } else {
                result = "状态行非200";
            }

        } catch (Exception e1) {
            result = e1.getStackTrace().toString();
        }
        return result;

    }

map确实是个好东西。

补充:

RxJava 操作符flatmap

RxJava变换操作符:.concatMap( )与.flatMap( )的比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值