RxJava flatMapIterable with Single

时间:2017-03-14 12:01:56

标签: android rx-android rx-java2

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

我遇到了一个问题,因为我以前使用flatMapIterable来接受我的回复(列表)并对每个项目执行某些操作。我没有看到我如何用Single实现这一目标。

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

如果getListOfItems正在返回Observable,但是如果我尝试让它返回Single,那么这可以正常工作,那么我不能flatMapIterable而不能看到一个替代方案,任何想法?

6 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:3)

基于yosriz的答案,这就是我在科特林

中得到的结果
getListOfItems()
        .flattenAsObservable { it }
        .flatMap { doSomethingWithItem(it) }
        .toList()

根据您的喜好,可以使用Kotlin的map实现相同的目的:

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

答案 2 :(得分:1)

我做过类似的事情

@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();
    }

答案 3 :(得分:1)

您可以使用运算符Single

Observable转换为toObservable()

看起来像这样:

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

答案 4 :(得分:0)

另一种方法是使用try_files $uri /index.html; flatMapPublisher

Flowable::fromIterable

答案 5 :(得分:0)

getListOfItems()
  .flattenAsObservable { it }
  .flatMapSingle { getSingleDoSomeThing(it) }
  .toList()