在 RxJava2 中实现滑动窗口

Cor*_*hin 4 java rx-java reactivex rx-java2

我正在尝试在 RxJava2 中实现一个简单的滑动窗口函数,但正在努力做我想做的事。

我的目标是获取对象流,即

["a", "b", "c", "d", "e"]
Run Code Online (Sandbox Code Playgroud)

并应用一个滑动窗口,它将返回与每个元素相邻的元素。

即导致:

["a", "b"]
["a", "b", "c"]
["b", "c", "d"]
["c", "d", "e"]
["d", "e"].
Run Code Online (Sandbox Code Playgroud)

IE

a----------------b----------------c----------------d----------------e
?                ?                ?                ?                ?
?                ?                ?                ?                ?
?                ?                ?                ?                ?
?                ?                ?                ?                ?
["a", "b"]       ["a", "b", "c"]  ["b", "c", "d"]  ["c", "d", "e"]  ["d", "e"]
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚如何做到这一点。Google Groups 帖子似乎走在正确的轨道上,但并没有得到我需要的结果:https : //groups.google.com/forum/#!topic/rxjava/k-U5BijXinU

有任何想法吗?

Lam*_*rak 6

取决于您是否希望您的 observable 发出List<Item>Observable<Item>您可以使用buffer()window()运算符。解决方案不是那么干净,但非常简单:

Observable.fromArray("a", "b", "c", "d", "e")
        .startWith("")
        .buffer(3, 1)
        .map(strings -> {
            strings.remove("");
            return strings;
        })
        .filter(strings -> strings.size() > 1)
Run Code Online (Sandbox Code Playgroud)

返回

["a", "b"]
["a", "b", "c"]
["b", "c", "d"]
["c", "d", "e"]
["d", "e"]
Run Code Online (Sandbox Code Playgroud)