RxJava flatMapIterable with Single

spO*_*oks 21 android rx-android rx-java2

我正在尝试整理我的代码,并且Single看起来对我来说是一个不错的选择,因为我正在做一些只能发出一个结果的东西.

我遇到了一个问题,因为我以前使用flatMapIterable我的回复(列表)并对每个项目做一些事情.我没有看到我如何用Single实现这个目标.

getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
Run Code Online (Sandbox Code Playgroud)

如果能正常工作getListOfItems是返回一个Observable,但如果我试图使它返回Single,那么我不能这样做flatMapIterable,不能看到另一种,任何想法?

yos*_*riz 43

flattenAsObservable应该做的伎俩,它将Single成功值映射到Iterable(列表),并将列表中的每个项目作为一个Observable.

  getListOfItems()
            .flattenAsObservable(new Function<Object, Iterable<?>>() {
                @Override
                public Iterable<?> apply(@NonNull Object o) throws Exception {
                    return toItems(o);
                }
            })
            .flatMap(item -> doSomethingWithItem())
            .toList()
Run Code Online (Sandbox Code Playgroud)


Seb*_*ian 6

基于yosriz的答案,这就是我最后在Kotlin遇到的问题

getListOfItems()
        .flattenAsObservable { it }
        .flatMap { doSomethingWithItem(it) }
        .toList()
Run Code Online (Sandbox Code Playgroud)

使用Kotlin's可以达到相同的效果map,具体取决于您的偏好:

getListOfItems()
        .map { items ->
            items.map {
                doSomethingWithItem(it)
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 在 Kotlin 中,你甚至可以编写 `getListOfItems().map { items -&gt; items.map { doSomethingWithItem(it) }` 虽然第一个 `map` 来自 RxJava 并在流发射上运行,第二个来自 Kotlin 并运行在 Iterable 上。 (2认同)

小智 5

您可以使用运算符转换SingleObservabletoObservable()

它看起来像这样:

getListOfItems()
    .toObservable()
    .flatMapIterable(items -> items)
    .flatMap(item -> doSomethingWithItem())
    .toList()
Run Code Online (Sandbox Code Playgroud)