私は

2017-03-02 3 views
0

、私はいくつかの場所のコレクションを意味私は

class Place { 
    userId, 
     price 
} 

以下のダミーのようなデータのコレクションを持っているいくつかのデータを平均化するために、いくつかのRxJavaコードより優れた作りに滞在するのに長い時間を持っています。

ユースケース:

  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

私はあなたの最初のコードは単なるコールループであると思います。拡張機能なしでは、1行だけで書く方法はないと思いますか? – TeeTracker

+1

RxJavaは、ツールがその内部と外部に分散しているコンポジションライブラリです。通常、ビジネス上の問題を解決するライナーはありません。あなたがAndroid上にいるので、Javaストリームへの直接アクセスはなく、Javaストリームのバックポートには外部依存関係が必要です。 – akarnokd