RxJava 转换操作符 flatMap
2016-02-23 16:29
585 查看
flatMap操作符是把Observable产生的结果转换成多个Observable,然后又直接把这些Observable转换一个Observable,并依次提交产生的结果给订阅者
规律:源Observable 传入flatMap对应参数,在flatMap中返回自定义的Observable
例子:扫描文件:
扫描结果:
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/0.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/1.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/2.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/3.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/4.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/5.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/6.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/7.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/8.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/9.text
flatMap和map的区别:map是将参数加工,flatMap是将源Observable变成多个Observable去处理并交给源Observable依次发送给订阅者
注意:这些新的Observable线程是默认伴随源Observable的:
线程关系:
02-24 16:27:42.118 25657-25835/? D/----->: ------>Thread1:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.118 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.118 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.118 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.138 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.138 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.138 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/.text
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/0.text
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/1.text
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/2.text
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/3.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/4.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/5.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/6.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/7.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/8.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/9.text
规律:源Observable 传入flatMap对应参数,在flatMap中返回自定义的Observable
例子:扫描文件:
private void flatMap() { Observable.just(getApplicationContext().getExternalCacheDir()).flatMap(new Func1<File, Observable<File>>() { @Override public Observable<File> call(File file) { return listFiles(file); } }).subscribe(new Action1<File>() { @Override public void call(File file) { LogUtils.d("------>:" + file.getAbsolutePath()); } }); } private Observable<File> listFiles(File f) { if (f.isDirectory()) { return Observable.from(f.listFiles()).flatMap(new Func1<File, Observable<File>>() { @Override public Observable<File> call(File file) { return listFiles(file); } }); } else { return Observable.just(f); } }
扫描结果:
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/0.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/1.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/2.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/3.text
02-24 16:13:02.038 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/4.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/5.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/6.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/7.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/8.text
02-24 16:13:02.048 24715-24715/? D/----->: ------>:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/9.text
flatMap和map的区别:map是将参数加工,flatMap是将源Observable变成多个Observable去处理并交给源Observable依次发送给订阅者
注意:这些新的Observable线程是默认伴随源Observable的:
private void flatMap() { Observable.just(getApplicationContext().getExternalCacheDir()).flatMap(new Func1<File, Observable<File>>() { @Override public Observable<File> call(File file) { LogUtils.d("------>Thread1:" + Thread.currentThread()); return listFiles(file); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<File>() { @Override public void call(File file) { LogUtils.d("------>Thread3:" + Thread.currentThread().getName() + " file:" + file.getAbsolutePath()); } }); } private Observable<File> listFiles(File f) { if (f.isDirectory()) { return Observable.from(f.listFiles()).flatMap(new Func1<File, Observable<File>>() { @Override public Observable<File> call(File file) { LogUtils.d("------>Thread2:" + Thread.currentThread()); return listFiles(file); } }); } else { return Observable.just(f); } }
线程关系:
02-24 16:27:42.118 25657-25835/? D/----->: ------>Thread1:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.118 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.118 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.118 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.128 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.138 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.138 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.138 25657-25835/? D/----->: ------>Thread2:Thread[RxCachedThreadScheduler-2,5,main]
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/.text
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/0.text
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/1.text
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/2.text
02-24 16:27:42.138 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/3.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/4.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/5.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/6.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/7.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/8.text
02-24 16:27:42.148 25657-25657/? D/----->: ------>Thread3:main file:/storage/sdcard0/Android/data/com.rxandroid.test1/cache/9.text
相关文章推荐
- java导出大量的excel
- Spring 事务管理配置
- JavaBean保存范围
- java.util.Date和java.sql.Date的区别
- java学习笔记-JAVA中toString方法的作用
- Java 7 Fork/Join 并行计算框架概览
- java概念
- JavaWeb工程中集成YMP框架快速上手(二)
- java中double四舍五入并自定义小数点位数
- Java线程池使用说明
- 解决Spring4 MVC请求json数据报406错误
- 2d toolkit tk2dUIScrollableArea拖动到最前位置与最后位置是否有Spring动画
- Java语法基础3(思维导图)
- Mycat分库分表的初次学习
- JAVA基础————两分钟看懂注解Annotation
- 【JAVA生成PDF】利用模板生成PDF
- Java中的io流浅解
- Eclipse : An error occurred while filtering resources
- spring mvc中log4j的配置与使用
- ecplise遇到You must restart adb and Eclipse.Please ensure that adb is correctly located at的问题