我有一个可观察的,它会发出大量数据,比如
[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] ......]
答案 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
的第一个项目会触发一个新缓冲区,第一个缓冲区为空。