[英]How to process first n items and remaining one differently in a observable stream
[英]How to process each item differently in a Observable stream(RxJava)
让我举个例子:给定从1到10的数字流,对偶数和奇数进行不同的处理。 在另一个线程中处理奇数,并将此转换应用于它们(2 * i)。 在主线程中处理偶数并将此转换应用于它们(2 * i-1)。 订户如下:
finalObservable.subscribe(new Action1<Integer>() {
@Override
public void call(Integer t) {
System.out.println(Thread.currentThread() + " " + t);
}});
输出应为
Thread-1 2
main 3
Thread-1 6
main 7
Thread-1 10
main 11
Thread-1 14
main 15
Thread-1 18
main 19
如何使用RxJava-Observables运算符执行此操作?
解决此问题的最优雅方法是使用Observable
share()
运算符。 通过简化,您可以将observable
的物体分成多个。 因此,在您的情况下,表示数字流的可观察对象可以分为两个可观察对象。 一个代表奇数,一个代表偶数。
假设allNumbers
(在您的示例中为finalObservable
)表示< finalObservable
>数字流:
final Observable<Integer> allNumbers =
Observable.from(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
.share();
Observable<Integer> oddNumbers = allNumbers.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer % 2 != 0;
}
});
Observable<Integer> evenNumbers = allNumbers.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer % 2 == 0;
}
});
final Action1<Integer> printingAction = new Action1<Integer>() {
@Override
public void call(Integer t) {
System.out.println(Thread.currentThread() + " " + t);
}
};
evenNumbers.subscribeOn(Schedulers.computation()).subscribe(printingAction);
oddNumbers.subscribeOn(AndroidSchedulers.mainThread()).subscribe(printingAction);
并通过Retrolambda进行了简化:
final Observable<Integer> allNumbers =
Observable.from(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
.share();
Observable<Integer> oddNumbers = allNumbers.filter(integer -> integer % 2 != 0);
Observable<Integer> evenNumbers = allNumbers.filter(integer -> integer % 2 == 0);
final Action1<Integer> printingAction =
t -> System.out.println(Thread.currentThread() + " " + t);
evenNumbers.subscribeOn(Schedulers.computation()).subscribe(printingAction);
oddNumbers.subscribeOn(AndroidSchedulers.mainThread()).subscribe(printingAction);
您没有确切指定在哪个线程中需要处理什么,因此您可能需要更正subscribeOn
参数并可能添加observeOn
运算符。 根据您的需要。
一般的想法是这样的(使用flatMap
):
Observable.from(new Integer[]{1, 2, 3, 4, 5})
.flatMap(number -> {
if (number % 2 == 0) {
return Observable.just(2 * number - 1);
} else {
return Observable.fromCallable(() -> 2 * number)
.subscribeOn(Schedulers.io());
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(Thread.currentThread() + " " + integer);
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.