web-dev-qa-db-ja.com

単一のRxJava flatMapIterable

私はコードを少し整理しようとしていますが、Singleは1つの結果しか出力しないようなことをしているので、私にとっては良い選択のようです。

ただし、以前にflatMapIterableを使用して応答(リスト)を取得し、各項目で何かを実行していたため、問題が発生しています。私はシングルでこれを達成する方法を見ていません。

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

getListOfItemsObservableを返す場合、これは正常に機能しますが、Singleを返そうとすると、flatMapIterableを実行できず、代替案はありますか?

20
spO_oks

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()
38
yosriz

Yosrizからの答えに基づいて、これは私がKotlinで終わったものです

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

好みに応じて、Kotlinのmapを使用しても同じことが実現できます。

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

演算子toObservable()を使用して、SingleObservableに変換できます。

次のようになります。

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

私はこのようなものを作りました

@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

別の方法は、flatMapPublisherFlowable::fromIterableを使用することです

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