2017-03-02 26 views
0

我有这样的伪数据低于我有很长一段时间停留在做一些RxJava代码更好的平均一些数据

class Place { 
    userId, 
     price 
} 

集合这意味着一些地方的集合。

用例:

  1. 有用户id和登录的用户。

  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. 
    
           } 
          }); 
    

回答

1

如果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库的一部分。

+0

我认为你的第一个代码也只是调用循环。你认为如果没有扩展名,只能在一行中写入吗? – TeeTracker

+1

RxJava是一个组合库,其中的工具分布在内部,有时在外部。通常没有一个班轮可以解决一个不平凡的商业案例。由于您使用的是Android,因此您无法直接访问Java Streams,并且任何Java Streams backport都需要外部依赖项。 – akarnokd

相关问题