ReactiveX:计算Observable中不同元素的频率

时间:2015-11-24 21:20:54

标签: java scala reactive-programming rx-java reactivex

我有Observable<String>。我想把它变成Map<String, Int>,告诉我每个不同字符串的出现次数。

observable包含~10亿个元素,其中1000个是不同的(因此不能将整个数据集存储在RAM中)。目前,我遍历Observable并更新HashMap。我还要确保在相同的线程上观察以避免竞争条件。但是,获取元素频率应该很容易并行化,因此使用它会很好。

有办法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用groupBy而不是自己维护HashMapgroupBy将为每个密钥创建一个Observable,您可以在另一个计划程序上订阅它。如,

public class KeyCounter {
    int key;
    long count;

    public KeyCounter(int key, long count) {
        this.key = key;
        this.count = count;
    }

    @Override
    public String toString() {
        return "key: " + key + " count: "  + count;
    }
}

@Test
public void foo() {
    Observable<Integer> o = Observable.just(1, 2, 3, 2, 1);
    o.groupBy(i -> i).flatMap(
        group ->
            group.subscribeOn(Schedulers.computation()).countLong().map(count -> new KeyCounter(group.getKey(), count))
    ).subscribe(System.out::println);

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}