2017-07-22 150 views
0

我仍然在努力與RxJava的一些基礎知識,並將非常感謝一些幫助。無限可觀察到的HashMap作爲可觀察的

我有一個無限的,熱的observable發出定期標記的事件(捕獲在一個簡單的類有一個名稱(標籤)和一些屬性)。標籤是有限的(在這種情況下,大約有10個不同的標籤),但事件細節每次都不相同(例如時間戳)。

我現在要做的是創建一個HashMap,標籤作爲關鍵字,事件作爲條目,這樣HashMap本身就成爲一個無限的可觀察對象,每次更改都會發出HashMap。

到目前爲止,我用Subject來訂閱原始的observable併發出HashMap,但我也看到了「.toMap」方法。然而,我無法弄清楚如何將這種方法與無限可觀的來源一起使用,並隨着每一次改變而發出。從文檔來看,我甚至不清楚這是否可能。

如果這是不可能的,除了使用主題,還有其他的方法來實現嗎?我想保持這種精益,主題似乎相當沉重。

+0

你想要一個'Map'或'Observable'?如果你想'Observable',你可以使用'groupBy'。如果你想要'Map',你可以將'GroupedObservable'收集到'Map'。 –

回答

1

這是我的代碼將其轉換爲MapObservable<Map>。但我不知道你爲什麼需要這樣做。

fun <T, K> Observable<T>.toInfiniteMap(keySelector: (T) -> K): Map<K, Observable<T>> { 
    val map = ConcurrentHashMap<K, Observable<T>>() 
    this.subscribeOn(Schedulers.newThread()) 
      .doOnNext { println(it) } 
      .groupBy(keySelector) 
      .doOnNext { map.put(it.getKey(), it) } 
      .subscribe() 
    return map 
} 

fun <T, K> Observable<T>.toInfiniteMapObservable(keySelector: (T) -> K): 
     Observable<Map<K, Observable<T>>> { 
    val map = ConcurrentHashMap<K, Observable<T>>() 
    return this.subscribeOn(Schedulers.newThread()) 
      .doOnNext { println(it) } 
      .groupBy(keySelector) 
      .doOnNext { map.put(it.getKey(), it) } 
      .map { map } 
}