web-dev-qa-db-ja.com

RxJava / RxAndroidでリストを反復する

私はRxJava/RxAndroidを使い始めたばかりですが、自分のユースケースにこだわっています。

List<A>を反復して各ABに非同期で変換しようとします(データベースへの呼び出しが必要なため)。成功するたびにObserverに通知する必要がありますメインスレッドでいくつかのジョブを実行するための変換(onNext()内)。

リスト全体の変換に成功し、onNext()List<B>を受け取りましたが、すべてのアイテムが完了したら、アイテムごとに通知する必要があります。

演算子fromを試してみましたが、from(List<A>)を使用する場合、Observerは同じタイプ(AではなくBからオブジェクトを受け取る必要があります_)。

List<A>全体をlist<B>に変換するコードは次のとおりです。ここで何を変更する必要がありますか?

private List<A> listOfA;

private startConversion() {
    Observer observer = new Observer<List<B>>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
        }

        @Override
        public void onNext(List<B> convertedItems) {
            onConversionCompleted(convertedItems);
        }
    };

    Observable<B> observervable = Observable.fromCallable(new Callable<List<B>>() {
        @Override
        public List<B> call() throws Exception {
            return convertListOfAToListOfB(listOfA);
        }
    });

    subscription = observable
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
}

PS:これは疑似コードです。

手伝ってくれてありがとう !

10
MHogge

各アイテムを個別のスレッドで1つずつ変換する場合は、この方法で行うことができます。

    Observable.from(list)    
            .map(input -> {
                // transform each A -> B
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(item -> {

            });

リストを出力するオブザーバブルがすでにあり、それをシーケンスに変換したい場合は、次を使用します。

        listObservable
            .flatMap(Observable::from)
            .subscribe(item -> {

            });

この2つの方法を組み合わせてすべての値を1か所で変換し、それらを1つずつ放出したい場合は、次のようにします。

    Observable.create(subscriber -> {
        for (Item item : items) {
            subscriber.onNext(transformA2B(item));
        }

        subscriber.onCompleted();
    });
19
Anton Pogonets

Observable.fromIterable(list)を使用して、リストからオブザーバブルのリストを作成することもできます。次に、アイテムを反復処理してリストに変換できます。

 Observable.fromIterable(list)
            .filter(item -> item.getId().equals("SampleId")
            .toList();
0
Gerardo Suarez
Observable
    //Loop through the list and emit value one by one
    .fromIterable(intList)
    //Modify the list item to new item
    .map(listItem -> listItem + 10)
    //Update UI or do anything here
    .doOnNext(System.out::println)
    //Convert to new list after modifying each item
    .toList()
    .subscribe(
        newList -> "You will get new list",
        error -> "error"
    );
0
arungiri_10

簡単な例を示します。

_public static void main(String[] args) {
    String[] s = {"a", "b", "c"};
    Observable.from(s).map(value -> "A"+value).subscribe(result -> System.out.println(result));
    Observable.timer(2, TimeUnit.SECONDS).toBlocking().subscribe();
}
_

あなたがリストを述べたように、私は簡単にするために配列を使用しています、リストさえfrom()のパラメータとして使用することができます

0
Pavan Kumar