RxJava缓冲区直到更改

时间:2018-03-15 06:55:53

标签: rx-java rx-java2

我有一个可观察的,它会发出大量数据,比如

  

[1,1,1,2,2,2,3,3,1,1,5,5 ......]

在RxJava中,我们可以使用distinctUntilChanged()获取不同的项目,直到它发生变化,结果会像

一样
  

[1,2,3,1,5,......]

同样有一种方法可以缓冲项目直到更改?例如,我希望输出像

  

[[1,1,1],[2,2,2],[3,3],[1,1],[5,5] ......]

1 个答案:

答案 0 :(得分:4)

您可以共享源序列,将distinctUntilChanged应用于一条路径,然后驱动buffer运算符使用Observable来表示边界:

@Test
@SuppressWarnings("unchecked")
public void test() {
    Observable.fromArray(1,1,1,2,2,2,3,3,1,1,5,5)
    .compose(bufferUntilChanged(v -> v))
    .test()
    .assertResult(
            Arrays.asList(1, 1, 1),
            Arrays.asList(2, 2, 2),
            Arrays.asList(3, 3),
            Arrays.asList(1, 1),
            Arrays.asList(5, 5)
        );
}

static final <T, K> ObservableTransformer<T, List<T>> bufferUntilChanged(
        Function<T, K> keySelector) {
    return o -> o.publish(q -> q.buffer(q.distinctUntilChanged(keySelector).skip(1)));
}

skip(1)就在那里,因为通过distinctUntilChanged的第一个项目会触发一个新缓冲区,第一个缓冲区为空。