簡體   English   中英

如何在Observable流中以不同方式處理每個項目(RxJava)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM