问题
I'm trying to tidy up my code a little, and Single is looking like a good choice for me as I'm doing something that will only ever emit one result.
I'm having an issue though as I was using flatMapIterable previously to take my response (a list) and do something on each item. I'm not seeing how I can achieve this with Single.
getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
This works fine if getListOfItems is returning an Observable but if I try and make it return a Single, then I can't do flatMapIterable and can't see an alternative, any ideas?
回答1:
flattenAsObservable should do the trick, it will map Single success value to Iterable (list), and emit each item of the list as an Observable.
getListOfItems()
.flattenAsObservable(new Function<Object, Iterable<?>>() {
@Override
public Iterable<?> apply(@NonNull Object o) throws Exception {
return toItems(o);
}
})
.flatMap(item -> doSomethingWithItem())
.toList()
回答2:
Building on the answer from yosriz, this is what I ended up with in Kotlin
getListOfItems()
.flattenAsObservable { it }
.flatMap { doSomethingWithItem(it) }
.toList()
The same can be achieved using Kotlin's map, depending on your preference:
getListOfItems()
.map { items ->
items.map {
doSomethingWithItem(it)
}
}
回答3:
You can convert Single to Observable by using operator toObservable()
It will look like this:
getListOfItems()
.toObservable()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
回答4:
I've made something like this
@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();
}
回答5:
Another way to do it is by using flatMapPublisher and Flowable::fromIterable
getListOfItems()
.flatMapPublisher(Flowable::fromIterable)
.flatMap(item -> doSomethingWithItem())
.toList()
来源:https://stackoverflow.com/questions/42785473/rxjava-flatmapiterable-with-a-single