我正在尝试整理我的代码,Single
看起来对我来说是一个不错的选择,因为我正在做一些只能发出一个结果的东西。
我遇到了一个问题,因为我以前使用flatMapIterable
来接受我的回复(列表)并对每个项目执行某些操作。我没有看到我如何用Single实现这一目标。
getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
如果getListOfItems
正在返回Observable
,但是如果我尝试让它返回Single
,那么这可以正常工作,那么我不能flatMapIterable
而不能看到一个替代方案,任何想法?
答案 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()