用 RxJava/RxAndroid 迭代列表
Iterate list with RxJava/RxAndroid
我是 RxJava/RxAndroid 的新手,但我受困于我的用例。
我尝试迭代一个 List<A>
以异步地将每个 A
转换为一个 B
(因为它需要调用数据库)并且我的 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: 这是伪代码
感谢您的帮助!
如果你想在单独的线程中一个一个地转换每个项目,你可以用这种方式来完成。
Observable.from(list)
.map(input -> {
// transform each A -> B
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(item -> {
});
如果您已经拥有发射列表的 observable 并希望将其转换为序列,请使用此:
listObservable
.flatMap(Observable::from)
.subscribe(item -> {
});
如果你想结合这两种方式并在一个地方转换所有值,但一个一个地发出它们,你可以这样做:
Observable.create(subscriber -> {
for (Item item : items) {
subscriber.onNext(transformA2B(item));
}
subscriber.onCompleted();
});
在这里..用简单的例子:
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()
的参数
您还可以使用 Observable.fromIterable(list) 从列表创建可观察值列表。然后您可以遍历这些项目并将其转换为列表。
Observable.fromIterable(list)
.filter(item -> item.getId().equals("SampleId")
.toList();
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"
);
我是 RxJava/RxAndroid 的新手,但我受困于我的用例。
我尝试迭代一个 List<A>
以异步地将每个 A
转换为一个 B
(因为它需要调用数据库)并且我的 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: 这是伪代码
感谢您的帮助!
如果你想在单独的线程中一个一个地转换每个项目,你可以用这种方式来完成。
Observable.from(list)
.map(input -> {
// transform each A -> B
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(item -> {
});
如果您已经拥有发射列表的 observable 并希望将其转换为序列,请使用此:
listObservable
.flatMap(Observable::from)
.subscribe(item -> {
});
如果你想结合这两种方式并在一个地方转换所有值,但一个一个地发出它们,你可以这样做:
Observable.create(subscriber -> {
for (Item item : items) {
subscriber.onNext(transformA2B(item));
}
subscriber.onCompleted();
});
在这里..用简单的例子:
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()
您还可以使用 Observable.fromIterable(list) 从列表创建可观察值列表。然后您可以遍历这些项目并将其转换为列表。
Observable.fromIterable(list)
.filter(item -> item.getId().equals("SampleId")
.toList();
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"
);