最優雅的方式來處理這個問題是使用share()
運營商Observable
的。在huuuuge簡化中,它可以讓你將你的observable
分成多個。所以在你的情況下,代表一串數字的觀察值可以被分成兩個觀測值。一個用於奇數,另一個用於偶數。
假設allNumbers
(在你的例子finalObservable
)表示< 1,10>數字流:
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);
你沒」 t確切地指定需要在哪個線程中處理哪些內容,因此您可能需要更正subscribeOn
參數並可能會添加observeOn
運算符。取決於你的需求。
謝謝,是的,這工作正常。我還有一個查詢。而不是訂閱2個不同的觀測值,是否有一種方法可以合併觀測值,使得輸出與輸入的順序相同? –
您可以使用'Observable.merge',但整個想法是,有兩個不同的observables,你可以以不同的線程處理它們。 –