首页 > 解决方案 > 当 flatMap 内部完成时,使原始 Observable 完成

问题描述

我有一个Observable我正在应用flatMap运算符的。当第二个完成时,是否有可能使这个原件Observable完成?

这是代码。

Observable.never<Int>()
        .startWith(0)
        .doOnComplete { println("Completed") } // Not called.
        .flatMap { Observable.fromArray(1, 2, 3, 4, 5) /* Completes after 5 */ }
        .subscribe(::println)

输出是:

1
2
3
4
5

我正在尝试实现以下输出:

1
2
3
4
5
Completed

标签: kotlinrx-java2

解决方案


您可以使用运算符materialize来帮助您获取有关内部情况的信息flatMap。然后,您可以在收到onComplete通知时处理上游(仅通过onNext通知)。

    Observable.<Integer>never()
            .startWith(0)
            .flatMap(integer -> Observable.range(1, 5)
                    .materialize())
            .takeWhile(notification -> notification.isOnNext())
            .map(notification -> notification.getValue())
            .doOnComplete(() -> System.out.println("Completed"))
            .subscribe(integer -> System.out.println(integer));

结果

1
2
3
4
5
Completed

推荐阅读