2017-07-20 9 views
3

私はStringlongを受け取り、Single<String>を返す関数を持っているとしましょう。RxJava - スキャンとフラットマップを組み合わせる方法はありますか?

Single<String> stringAddition(String someString, long value) { 
    return Single.just(someString + Long.toString(value)); 
} 

今、私はこれを行う方法の損失でよ、このObservable ...

Observable.interval(1, SECONDS) 
    .scan("", (cumulativeString, item) -> { 
    // Need to return the result of stringAddition(cummulativeString, item) 
    }); 

を持っています。スキャンでStringを返す必要がありますが、私はSingle<String>を返すメソッドを使用します。私には、scanflatMapの両方の動作を組み合わせることができるものが必要なようです。私を助けるRxJava2ウィザードがありますか?

+0

を返されていた場合、これはやや短縮することができますか? – akarnokd

+0

私は、文脈のはるかに複雑な問題のための簡単な例を考え出していました。私の現在のプロジェクトでは、実際には 'Single 'というWebサービスリクエストです。 –

+0

私の例は実際に私が解決しようとしている問題を正しく示すためにはあまりにも些細なことであることが分かります。私が 'Single 'を累積値としてスキャンすると、実際にはすべての要求を2回実行することになります:( –

答えて

3

次のようにして実現できます。なぜあなたが最初の場所で ``シングル を返さない stringAdditionObservable

Observable<String> scanned = Observable.interval(1, TimeUnit.SECONDS) 
      .scan(
        Observable.just(""), 
        (cumulativeString, item) -> 
         cumulativeString 
          .flatMap(str -> stringAddition(str, item).toObservable()) 
      ) 
      .flatMap(it -> it); 
+0

この回答は実際には私の簡単な例ではうまくいきます。スキャン中の 'flatMap'にもう一度、もう一度' flatMap'の外側にあります。 'Single 'が二度購読されていないということを考えることができますか? –

+0

私は、 'scan'によって生成された' Observable'で '.cache()'を呼び出すとうまくいくはずですが、もっとうまくいくはずです! –

関連する問題