2015-06-13 16 views
7

Aşağıdaki kodu dönüşümü yapar. Ben olsun çıktısı: beklendiği gibiGroupBy operatörü, farklı gruplardan ürün

source emitting 0 
    groupBy called for 0 
    got observable [email protected] for key 0 
    key 0, item 0 
    source emitting 1 
    groupBy called for 1 
    got observable [email protected] for key 1 
    key 1, item 1 
    source emitting 2 
    groupBy called for 2 
    got observable [email protected] for key 2 
    key 2, item 2 
    source emitting 3 
    groupBy called for 3 
    key 0, item 3 
    source emitting 4 
    groupBy called for 4 
    key 1, item 4 
    source emitting 5 
    groupBy called for 5 
    key 2, item 5 
    source emitting 6 
    groupBy called for 6 
    key 0, item 6 
    source emitting 7 
    groupBy called for 7 
    key 1, item 7 
    source emitting 8 
    groupBy called for 8 
    key 2, item 8 
    source emitting 9 
    groupBy called for 9 
    key 0, item 9 

Yani, yöntem abone üst düzeyde, ben, GroupedObservable 3 gözlenebilirleri olsun. Sonra, birer birer, gruplanmış gözlemlenebilirliklere abone oluyorum - ve burada anlamadığım şey:

Orijinal öğeler neden orijinal dizide yayınlanıyor (yani 0, 1, 2, 3, ..). .) ve 0, 3, 6, 9 ... 0 tuşu için, sonra 1 tuşu için 1, 4, 7, ardından 2 tuşu için 2, 5, 8 izler.

Ben grupları oluşturulduğunda anlamak düşünüyorum:

1. 0 is emitted, the key function is called and it gets 0 
2. it is checked if an observable for 0 exists, it doesn't, so a new one is created and emitted, and then it emits 0 
3. the same happens for source items 1 and 2 as they both create new groups, and observables with key 1 and 2 are emitted, and they emit 1 and 2 correspondingly 
4. source item 3 is emitted, the key function is called and it gets 0 
5. it is checked if an observable for 0 exists, it does -> no new grouped observable is created nor emitted, but 3 is emitted by the already existing observable 
6. etc. until the source sequence is drained 

Ben gruplandırılmış gözlenebilirlerin tek tek almak rağmen, emisyon nasılsa araya eklenmiş gibi görünüyor. Bu nasıl olur?

cevap

4

neden yine orijinal dizi yayılan orijinal ürün (yani, 0, 1, 2, 3, ...) ve 0, 3, 6, 9 ... 1, ardından 0 anahtar için Tuş 1 için 4, 7, sonra anahtar 2 için 2, 5, 8 izler misiniz?

Kendi sorunuza cevap verdiniz. Yayınladıkları sırayla bir öğe akışı üzerinde çalışıyorsunuz. Her biri yaydığı gibi, operatör zincirinden geçer ve burada gösterdiğiniz çıktıyı görürsünüz.

Orada beklediğiniz alternatif çıktı, kaynağın tüm grupları için öğeleri yayana kadar zinciri beklemesini gerektirir. Observable.just(0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 0) olduğunu söyle. Sonra çıkış gruplarınız olarak (0, 3, 0), (1, 4, 4, 4, 4, 4, 4), (2) bekleyeceksiniz. Ya 4'lü sonsuz bir akışınız varsa? Abonenin ilk grubu 0, 3 ..

Aradığınız davranışı oluşturabilirsiniz. toList operatör aboneye bir List<R> geçmesi ardından kaynak tamamlanana kadar çıktı önbelleğe ve olacaktır: Ben ToList hakkında bilmek

.subscribe(observable -> { 
    System.out.println("got observable " + observable + " for key " + observable.getKey()); 
    observable.toList().subscribe(items -> { 
     // items is a List<Integer> 
     System.out.println("key " + observable.getKey() + ", items " + items); 
    }); 
}); 
+0

() kandırmak. Ayrıca bu davranışın mantıklı olduğunu biliyorum ve örnek olarak nedenini göstermek için çok iyisiniz. Benim işleyiş şeklini nasıl uyguladığı hakkında bir kayıp yaşıyorum. 3 tane gözlenebilirim var ve gruplama tarafından yayıldıkça onlara abone oluyorum - ama nasıl bir araya getirilebilir? Bu 3 abonelik hemen gerçekleşmiş gibi ve daha sonra emisyonlar asenkron bir tür oldu. Bunun üzerine biraz ışık tutabilir misin? – wujek

+1

Farklı gruplar için 3 abonelik, isteğe bağlı olarak yeni bir 'grup' oluşturulduğunda gerçekleşir. Emisyonlar gerçekte _synchronously_ oluyor - çünkü hepsi aynı iş parçacığında olduğu için, her biri bir sonraki işlenmeden önce işlenmeyi bitirmek zorunda. Sanırım muhtemelen özlediğiniz anahtar nokta bu mu? –

+0

'hepsi aynı iş parçacığında, her birinin bir sonraki işlenmeden önce işlenmesini bitirmesi gerekiyor' - bu benim elde edemediğim şey. Çıktı, her zaman aynı anda ele alındığını gösterir; İlk grubun ilk tükendiği ve ardından bir sonraki resmin ortaya çıktığı değil - bunların emisyonları birbiri ile karışıyor. – wujek