Rx android 我花了很长时间来改进一些RxJava代码,以平均一些数据

Rx android 我花了很长时间来改进一些RxJava代码,以平均一些数据,rx-android,rx-java2,Rx Android,Rx Java2,我收集了一些数据,如下面的dummy class Place { userId, price } 这意味着一些地方的集合 用例: 有一个用户具有userId和登录名 如何计算等于userId的平均位置价格 RxJava很好,我尝试过过滤器和列表,但是它的性能不是很好 Observable.fromIterable(places) .subscribeOn(Schedulers.newThread()) .filter(new Pr

我收集了一些数据,如下面的dummy

class Place {
     userId,
      price
 }
这意味着一些地方的集合

用例:

  • 有一个用户具有userId和登录名

  • 如何计算等于userId的平均位置价格

  • RxJava很好,我尝试过
    过滤器
    列表
    ,但是它的性能不是很好

    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.
    
                  }
              });
    
    Observable.fromIterable(位置)
    .subscribeOn(Schedulers.newThread())
    .filter(新谓词(){
    @凌驾
    公共布尔测试(Place)引发异常{
    return place.userId==global.login.userId;
    }
    })
    托利斯先生()
    .observeOn(AndroidSchedulers.mainThread())
    .订阅(新消费者){
    @凌驾
    public void accept(List filteredPlace)引发异常{
    //在这里,我必须使用循环来做数学平均,平均是不好的。
    }
    });
    

  • 如果
    位置
    是内存中已有的内容,则可以按如下方式重新安排计算:

    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 */ });
    

    MathObservable
    是库的一部分。

    我认为您的第一个代码也是调用循环。你认为没有扩展就没有办法只写一行吗?RxJava是一个组合库,工具分布在它内部,有时也分布在它外部。通常情况下,没有一条线性规划可以解决一个非常重要的业务案例。因为您使用的是Android,所以无法直接访问Java Streams,任何Java Streams的后台端口都需要外部依赖。
    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 */ });