问题
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