RxJava 操作符
flatMap
- 参数
- 接收一个函数
- 这个函数接收源
Observable
发出的值 - 这个函数返回
Observable
- 流程
subscribe()
后执行函数- 然后订阅函数返回的
Observable
,进而执行这个Observable
里的订阅动作 - 收集所有第
2
步聚中Observable
输出的值,收集完成后,发出这些值
- 注意点
- 最后发出的值顺序与函数接收到值的顺序不相关,取决于流程3中各
Observable
输出的顺序
- 最后发出的值顺序与函数接收到值的顺序不相关,取决于流程3中各
示例代码与结果
@Test public void flatMap2() throws Exception { final List<String> items = Lists.newArrayList("a", "b", "c", "d", "e", "f"); final TestScheduler scheduler = new TestScheduler(); Observable.fromIterable(items) .flatMap((Function<String, ObservableSource<String>>) s -> { System.out.println("x-" + s); final int delay = new Random().nextInt(15); return Observable.create((ObservableOnSubscribe<String>) emitter -> { System.out.println("y-" + s); emitter.onNext(s); emitter.onComplete(); }).delay(delay, TimeUnit.SECONDS, scheduler); // 这里 delay 时长不同,导致最终数据顺序变化 }) .subscribe(System.out::println); scheduler.advanceTimeBy(1, TimeUnit.MINUTES); }
x-a y-a x-b y-b x-c y-c x-d y-d x-e y-e x-f y-f f e b d a c