RxJava flatMapIterable with Single

问题描述 投票:17回答:5

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

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

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

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

android rx-android rx-java2
5个回答
37
投票

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

4
投票

基于yosriz的答案,这就是我在Kotlin中得到的结果

getListOfItems()
        .flattenAsObservable { it }
        .flatMap { doSomethingWithItem(it) }
        .toList()

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

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

2
投票

您可以使用运算符SingleObservable转换为toObservable()

它看起来像这样:

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

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

0
投票

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

getListOfItems()
    .flatMapPublisher(Flowable::fromIterable)
    .flatMap(item -> doSomethingWithItem())
    .toList()
© www.soinside.com 2019 - 2024. All rights reserved.