使用RxJava / RxAndroid迭代列表

时间:2017-01-19 15:55:47

标签: rx-java rx-android

我是RxJava / RxAndroid的新手但是我的用例一直困在我们身上。

我尝试迭代List<A>以将每个A异步转换为B(因为它需要调用数据库),并且每次成功都应通知我的Observer转换(在onNext()中)在主线程上做一些工作。

我成功设法转换整个列表,然后在List<B>收到了onNext(),但我需要收到每个项目的通知,而不是所有项目都已完成。

我尝试使用操作符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:这是伪代码。

感谢您的帮助!

4 个答案:

答案 0 :(得分:14)

如果你想在单独的线程中逐个转换每个项目,你可以这样做。

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

            });

如果你已经有一个可观察的发射列表并希望将其转换为序列,请使用:

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

            });

如果你想要将这两种方式结合起来并在一个地方转换所有值但是逐个发出它们,你可以这样做:

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

        subscriber.onCompleted();
    });

答案 1 :(得分:0)

这是......用简单的例子:

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()的参数

答案 2 :(得分:0)

您还可以使用Observable.fromIterable(list)从列表创建可观察对象的列表。然后,您可以遍历项目并将其转换为列表。

 Observable.fromIterable(list)
            .filter(item -> item.getId().equals("SampleId")
            .toList();

答案 3 :(得分:0)

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"
    );