我有很长一段时间致力于使一些 RxJava 代码更好地平均一些数据

I have a long time to stay at making some RxJava codes better to average some data

我有一个像下面的虚拟数据集

class Place {
     userId,
      price
 }

也就是一些地方的集合。

用例:

  1. 有一个用户有userId和login。

  2. 如何计算等于userId的平均店面价格?

  3. RxJava 很好,我已经尝试过 filtertoList,但是它的性能不是很好。

    Observable.fromIterable(places)
              .subscribeOn(Schedulers.newThread())
              .filter(new Predicate<Place>() {
                  @Override
                  public boolean test(Place place) throws Exception {
                      return place.userId == global.login.userId;
                  }
              })
              .toList()
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(new Consumer<List<Place>>() {
                  @Override
                  public void accept(List<Place> filteredPlace) throws Exception {
                   //Here I have to use loop to do math-average, it is not nice to average.
    
                  }
              });
    

如果 places 已经存在于内存中,您可以像这样重新排列评估:

Observable.just(places)
   .subscribeOn(Schedulers.computation())
   .map((Iterable<Place> list) -> {
       double sum = 0.0;
       int count = 0;
       for (Place p : list) {
           if (p.userId == global.login.userId) {
               sum += p.price;
               count++;
           }
       }
       return sum / count;
   })
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(average -> { /* display average */ });

如果 places 的序列随时间变得可用(通过 Observable):

Observable<Place> places = ...
places
   .observeOn(Schedulers.computation())
   .filter((Place p) -> p.userId == global.login.userId)
   .compose(o -> MathObservable.averageDouble(o.map(p -> p.price)))
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(average -> { /* display average */ });

MathObservableRxJava 2 Extensions 库的一部分。