RxJava flatMapIterable 与单一

RxJava flatMapIterable with a Single

我正在尝试稍微整理一下我的代码,Single 对我来说是个不错的选择,因为我正在做的事情只会发出一个结果。

我遇到了一个问题,因为我之前使用 flatMapIterable 来获取我的回复(列表)并对每个项目执行一些操作。我不知道如何使用 Single 实现此目的。

getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()

如果 getListOfItems 是 return 一个 Observable,这工作正常,但如果我尝试使它成为 return 一个 Single,那么我可以'不做 flatMapIterable 并且看不到替代方案,有什么想法吗?

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()

我做过这样的东西

@Override
public Single<List<String>> getAvailablePaths() {
        return mongoClient.rxFind("t_polygons", new JsonObject())
                            .toObservable()
                            .flatMapIterable(list -> list)
                            .map(json -> json.getString("path"))
                            .filter(Objects::nonNull)
                            .toList()
                            .toSingle();
    }

您可以使用运算符 toObservable()

Single 转换为 Observable

它看起来像这样:

getListOfItems()
    .toObservable()
    .flatMapIterable(items -> items)
    .flatMap(item -> doSomethingWithItem())
    .toList()

基于 yosriz 的回答,这就是我在 Kotlin

中的最终结果
getListOfItems()
        .flattenAsObservable { it }
        .flatMap { doSomethingWithItem(it) }
        .toList()

同样可以使用 Kotlin 的 map 实现,具体取决于您的偏好:

getListOfItems()
        .map { items ->
            items.map {
                doSomethingWithItem(it)
            }
        }

另一种方法是使用 flatMapPublisherFlowable::fromIterable

getListOfItems()
    .flatMapPublisher(Flowable::fromIterable)
    .flatMap(item -> doSomethingWithItem())
    .toList()
getListOfItems()
  .flattenAsObservable { it }
  .flatMapSingle { getSingleDoSomeThing(it) }
  .toList()