RxJava 操做符

RxJava 操做符

flatMap

  • 参数
    1. 接收一个函数
    2. 这个函数接收源 Observable 发出的值
    3. 这个函数返回 Observable
  • 流程
    1. subscribe() 后执行函数
    2. 而后订阅函数返回的 Observable,进而执行这个Observable里的订阅动做
    3. 收集全部第2步聚中 Observable 输出的值,收集完成后,发出这些值
  • 注意点
    1. 最后发出的值顺序与函数接收到值的顺序不相关,取决于流程3中各 Observable 输出的顺序
  • 示例代码与结果
@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 cjava