web-dev-qa-db-fra.com

RxJava flatMapIterable avec un seul

J'essaie de ranger un peu mon code, et Single me semble être un bon choix car je fais quelque chose qui n'émettra qu'un seul résultat.

J'ai un problème cependant car j'utilisais flatMapIterable précédemment pour prendre ma réponse (une liste) et faire quelque chose sur chaque élément. Je ne vois pas comment je peux y arriver avec Single.

getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()

Cela fonctionne bien si getListOfItems renvoie un Observable mais si j'essaye de le faire retourner un Single, alors je ne peux pas faire flatMapIterable et je peux ' t voyez une alternative, des idées?

20
spO_oks

flattenAsObservable devrait faire l'affaire, il mappera Single la valeur de réussite à Iterable (liste), et émettra chaque élément de la liste en tant que Observable .

  getListOfItems()
            .flattenAsObservable(new Function<Object, Iterable<?>>() {
                @Override
                public Iterable<?> apply(@NonNull Object o) throws Exception {
                    return toItems(o);
                }
            })
            .flatMap(item -> doSomethingWithItem())
            .toList()
38
yosriz

En s'appuyant sur la réponse de yosriz, voici ce que j'ai fini avec Kotlin

getListOfItems()
        .flattenAsObservable { it }
        .flatMap { doSomethingWithItem(it) }
        .toList()

La même chose peut être obtenue en utilisant map de Kotlin, selon votre préférence:

getListOfItems()
        .map { items ->
            items.map {
                doSomethingWithItem(it)
            }
        }
4
Sebastian

Vous pouvez convertir Single en Observable en utilisant l'opérateur toObservable()

Il ressemblera à ceci:

getListOfItems()
    .toObservable()
    .flatMapIterable(items -> items)
    .flatMap(item -> doSomethingWithItem())
    .toList()
2
TermLog

J'ai fait quelque chose comme ça

@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();
    }
1
b3lowster

Une autre méthode consiste à utiliser flatMapPublisher et Flowable::fromIterable

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