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?
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()
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)
}
}
Vous pouvez convertir Single
en Observable
en utilisant l'opérateur toObservable()
Il ressemblera à ceci:
getListOfItems()
.toObservable()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
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();
}
Une autre méthode consiste à utiliser flatMapPublisher
et Flowable::fromIterable
getListOfItems()
.flatMapPublisher(Flowable::fromIterable)
.flatMap(item -> doSomethingWithItem())
.toList()