RxJava 操作符map

网友投稿 297 2022-11-03


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​​

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

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

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

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

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

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

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

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

public static final String HOST = ; @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() { @Override public String call(String s) { return HOST + s; } }).map(new Func1() { @Override public String call(String s) { return doNetTask(s); } }).subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @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

map确实是个好东西。

补充:

​​RxJava 操作符flatmap​​

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:学位证书编号查询API(学位证书编号查询方法)
下一篇:android studio代码混淆注意问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~