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)
}
}
另一种方法是使用 flatMapPublisher
和 Flowable::fromIterable
getListOfItems()
.flatMapPublisher(Flowable::fromIterable)
.flatMap(item -> doSomethingWithItem())
.toList()
getListOfItems()
.flattenAsObservable { it }
.flatMapSingle { getSingleDoSomeThing(it) }
.toList()
我正在尝试稍微整理一下我的代码,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)
}
}
另一种方法是使用 flatMapPublisher
和 Flowable::fromIterable
getListOfItems()
.flatMapPublisher(Flowable::fromIterable)
.flatMap(item -> doSomethingWithItem())
.toList()
getListOfItems()
.flattenAsObservable { it }
.flatMapSingle { getSingleDoSomeThing(it) }
.toList()