我正在尝试整理我的代码,Single
看起来对我来说是一个不错的选择,因为我正在做一些只能发出一个结果的东西。
我有一个问题,因为我以前使用flatMapIterable
来接受我的回复(列表)并对每个项目做一些事情。我没有看到我如何用Single实现这一目标。
getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
如果getListOfItems
返回Observable
但是如果我尝试让它返回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()
基于yosriz的答案,这就是我在Kotlin中得到的结果
getListOfItems()
.flattenAsObservable { it }
.flatMap { doSomethingWithItem(it) }
.toList()
使用Kotlin的map
可以实现同样的效果,具体取决于您的偏好:
getListOfItems()
.map { items ->
items.map {
doSomethingWithItem(it)
}
}
您可以使用运算符Single
将Observable
转换为toObservable()
它看起来像这样:
getListOfItems()
.toObservable()
.flatMapIterable(items -> items)
.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();
}
另一种方法是使用flatMapPublisher
和Flowable::fromIterable
getListOfItems()
.flatMapPublisher(Flowable::fromIterable)
.flatMap(item -> doSomethingWithItem())
.toList()