RxJava中使用Single的flatMapIterable方法

34

我正在整理自己的代码,Single 看起来是一个很好的选择,因为我只需要发出一个结果。

然而,我遇到了一个问题,以前我使用 flatMapIterable 来处理响应(一个列表)并对每个项目执行操作。我不知道如何在 Single 中实现这一点。

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

如果getListOfItems返回一个Observable,那么它可以很好地工作。但如果我试图让它返回一个Single,那么我就不能使用flatMapIterable,也看不到其他替代方法,请问有什么建议吗?

6个回答

63

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

谢谢!这就是我在寻找的内容。 - spO_oks
1
Single.flattenAsObservable不存在。这是RxJava 1的事情吗?是否有v2的等效物? - miguel
1
@miguel,这是仅适用于RxJava 2的。 - yosriz
@miguel,它只存在于Single和Maybe中。Observable、Flowable或Completable中不存在。 - Peter F

15

在yosriz的回答基础上,这是我在Kotlin中得出的结果。

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

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

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

2
在 Kotlin 中,你甚至可以写成 getListOfItems().map { items -> items.map { doSomethingWithItem(it) } 虽然第一个 map 是来自 RxJava 并作用于流的发射,但第二个是来自 Kotlin 并作用于可迭代对象。 - Peter F

4

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

示例如下:

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

2
我做了类似这样的东西。
@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()

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

如果您解释一下您的代码,那么这个答案会更好。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接