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?
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()
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)
}
}
You can convert Single
to Observable
by using operator toObservable()
It will look like this:
getListOfItems()
.toObservable()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
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();
}
Another way to do it is by using flatMapPublisher
and Flowable::fromIterable
getListOfItems()
.flatMapPublisher(Flowable::fromIterable)
.flatMap(item -> doSomethingWithItem())
.toList()