2017-12-30 23 views
0

小さなプロジェクトをRxに書き直していました。反復バージョンをRxに書き換える方法

プロジェクトの目標は、すべての

  1. NBA選手の合計レコードのリストを作成することです(レコードは給与情報+の両方が情報を統計収集:レブロンは、合計で10百万人を支払ったと35000ポイントを獲得している、3120アシストなど)。
  2. NBAチーム(一般的なチームの記録統計情報:勝敗):NBAの開始以来、Cavsは356-200を記録していました。

だから、最終的に我々は2つの大きなレコードを取得します(レコード== csvファイル、各選手/チームのライン): NBA選手:

  • レブロン、10E6、35000、3120
  • 神戸、3E6、1020年、122

など

NBAチーム

  • CAVS、356、200
  • ウォリアーズ、1000年、30

など

は当初、選手の配列がありますし、各プレイヤーは、年間給与の配列を持っていた基本的にはレブロンが再生しました多くの季節があり、彼についての情報:[10e6,15e6,20e6]を更新し、更新情報(給与フィールド)、Map<Player, Info>に給料、ポイント、アシストなどのフィールドがあります。だから私たちはプレイヤーを反復し、最初にそれらをキーとして挿入し、その給与フィールドを増やすことができます。

そして、我々はMap<Player, Info>(ポイント、アシストフィールド)とそれに続くMap<Team, WLBalance>の繰り返しと更新を行っています。ここでWLBalanceは単なるペアです。

今私はRxに切り替える必要があり、2つの観測値があります(1つは<Player, Salary in some year>を発し、もう1つはGameInfoを発する)。 NBA選手:

  • レブロン、10E6、35000、3120
  • 神戸、3E6、1020年、122 など

NBAチーム:

そして最後に、私は結果レコードを発するようにしたいです
  • CAVS、356、200
  • 戦士1000、30

私は観測のためのFUNC(給与、ポイント、支援し得るために)をreduceを使用したいのですが、私はPlayer最初に基づいてフィルタリングする方法をいくつかのアイデアを思い付くことができません。それでは、値をMap<K, V>に更新し、Observableの値を減らさないようにします。

だから私の質問は以下のとおりです。これらの合計の記録Beause

  1. 観察し、放出する、それがどのタイプである必要があり、両方の?それから主題のように見える。
  2. Rxのマップロジックをどのように置き換えることができますか(Rxアプローチが良いでしょう)。アイデアは、最初にこのプレーヤーに関する給与情報を得て、それから統計を更新しようとしているのか、それとも最初に彼についての統計を得たのか、給与を見たのか分からないということです。このプレーヤー最初に)。 。

答えて

0

は、それはあなたがデータを取得するどのような順序はまだ明らかではないが、しかし、あなたは、単にプレイヤーによって削減したい場合は、マッピングを実行するgroupBy()演算子を使用することができます。

PlayerInfo mergeIt(PlayerInfo accumulator, PlayerInfo player) { 
    accumulator.name = player.name; 
    accumulator.salary += player.salary; 
    accumulator.points += player.points; 
    accumulator.assists += player.assists; 
    return accumulator; 
} 

void runIt() { 
    PublishSubject<PlayerInfo> pi = PublishSubject.create(); 
    pi.groupBy(PlayerInfo::getName) 
     .flatMap(players -> players.collect(PlayerInfo::new, 
              (piNew, p) -> mergeIt(piNew, p))) 
     .subscribe(System.out::println); 
    pi.onNext(new PlayerInfo("LeBron", 14000.0, 21, 32)); 
    pi.onNext(new PlayerInfo("Kobe", 12000.0, 22, 31)); 
    pi.onNext(new PlayerInfo("LeBron", 6000.0, 4, 14)); 
    pi.onCompleted(); 
} 

ますチームのデータに対しても同じことができます。

関連する問題