2017-03-02 54 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

相關問題