私はコードを少し整理しようとしていますが、Single
は1つの結果しか出力しないようなことをしているので、私にとっては良い選択のようです。
ただし、以前にflatMapIterable
を使用して応答(リスト)を取得し、各項目で何かを実行していたため、問題が発生しています。私はシングルでこれを達成する方法を見ていません。
getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
getListOfItems
がObservable
を返す場合、これは正常に機能しますが、Single
を返そうとすると、flatMapIterable
を実行できず、代替案はありますか?
flattenAsObservable トリックを行う必要があり、Single
成功値をIterable
(リスト)にマッピングし、リストの各項目をObservable
として出力します。
getListOfItems()
.flattenAsObservable(new Function<Object, Iterable<?>>() {
@Override
public Iterable<?> apply(@NonNull Object o) throws Exception {
return toItems(o);
}
})
.flatMap(item -> doSomethingWithItem())
.toList()
Yosrizからの答えに基づいて、これは私がKotlinで終わったものです
getListOfItems()
.flattenAsObservable { it }
.flatMap { doSomethingWithItem(it) }
.toList()
好みに応じて、Kotlinのmap
を使用しても同じことが実現できます。
getListOfItems()
.map { items ->
items.map {
doSomethingWithItem(it)
}
}
演算子toObservable()
を使用して、Single
をObservable
に変換できます。
次のようになります。
getListOfItems()
.toObservable()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()
私はこのようなものを作りました
@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();
}
別の方法は、flatMapPublisher
とFlowable::fromIterable
を使用することです
getListOfItems()
.flatMapPublisher(Flowable::fromIterable)
.flatMap(item -> doSomethingWithItem())
.toList()