2017-03-29 9 views
0

どうすればいいですか?私は次のように思いついた、それは私はyのxのxを計算することができますが、私は同様にyを計算するために改善することができますか?RxJava - yのxを持つカウンタ

Observable<LoadedPhoneContact> phoneContacts = getPhoneContacts() 
     .flatMapObservable(contacts -> Observable.fromIterable(contacts)); 

Observable<Integer> phoneContactsCounter = phoneContacts 
     .cache() 
     .map(contact -> 1) 
     .reduce((c1, c2) -> c2 + c2) 
     .toObservable(); 

mSimils = phoneContacts 
     .zipWith(phoneContactsCounter, (contact, index) -> new Pair<>(contact, index)) 
     .doOnNext(data -> { 
      L.d("x/y = %d/%d", data.second, ?); 
     }) 
     .map(data -> SimilUtil.calcSimils(data)) 
     ; 

いいえ、それとも優れた代替ソリューションですか?

私は「処理Yアイテムのx」のような形式で進行状況を見ることができるようにしたい...

私は、カウントを発するが、これは正しい方法であることを第三の観察可能とジップができ?これは簡単に(あなたが最初の場所でのRxを使用することによって回避している)スレッドの同期の問題を引き起こす可能性がありますように私は間違いなく、受信コールバック内部の副作用を持っていないお勧めします

Observable<?> result = Observable.defer(() -> { 
    int[] counter = { 1 }; 
    return getPhoneContacts() 
     .toObservable() 
     .flatMapIterable(list -> list, (list, element) -> { 
      L.d("x/y = %d/%d", counter[0]++, list.size()); 
      return SimilUtil.calcSimils(element); 
     }); 
}); 

答えて

2

代わりに、.mapWithIndex(...) -operatorを持つrxjava-extrasを使用できます。

+0

これは機能します。実際に私はいつもストリームの流れの外にある変数を持っていないと思ったので、別の方法を見つけようとしたのです。 – prom85

+0

その理由は、defer()を使用して、ジッパー。 – akarnokd

+0

私はそれが延期の理由であることに気がつきました。ありがとう – prom85

0

:これはどのように

関連する問題