HashMap的无限可观察为可观察的

时间:2017-07-22 17:06:44

标签: hashmap rx-java observable reactive-programming

我仍然在努力学习RxJava的一些基础知识,并非常感谢一些帮助。

我有一个无限的,热的observable,它定期发出标记的事件(在一个简单的类中捕获具有名称(标记)和一些属性)。标签是有限的(在这种情况下大约有10个不同的标签)但事件细节每次都不同(例如时间戳)。

我现在要做的是创建一个HashMap,标签为键,事件为条目,这样HashMap本身就变成了一个无限的可观察对象,每次更改都会发出HashMap。

到目前为止,我使用Subject来订阅原始的observable并发出HashMap,但我也看到了“.toMap”方法。但是,我无法弄清楚如何将该方法与无限可观察源一起使用并随每次更改发出。从文档中我甚至都不清楚这是否可行。

如果不可能,除了使用主题之外还有另一种方法可以达到同样的目的吗?我想保持这种精益,主体似乎相当沉重。

1 个答案:

答案 0 :(得分: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 }
}