Skip to content Skip to sidebar Skip to footer

Rxjava Flatmapiterable With A Single

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

Solution 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 {
                    returntoItems(o);
                }
            })
            .flatMap(item -> doSomethingWithItem())
            .toList()

Solution 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)
            }
        }

Solution 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()

Solution 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();
    }

Solution 5:

Another way to do it is by using flatMapPublisher and Flowable::fromIterable

getListOfItems()
    .flatMapPublisher(Flowable::fromIterable)
    .flatMap(item -> doSomethingWithItem())
    .toList()

Post a Comment for "Rxjava Flatmapiterable With A Single"