Rxjava - 如何获取当前项和上一项?

Voi*_*ler 4 kotlin rx-java rx-kotlin

如何使用运算符以便我始终获得先前值和当前值?如果可能的话,我想避免在管道外创建状态。

- time ->
1      2      3      4
|      |      |      |
Operations
       |      |      |
       (1,2)  (2,3)  (3,4)

Run Code Online (Sandbox Code Playgroud)

请注意,除了第一个和最后一个值之外的每个值都必须出现两次,因此简单的缓冲区是行不通的。

我考虑过skipmergeand结合buffer,但合并似乎并不能保证顺序。

val s = PublishSubject.create<Int>()
s.mergeWith(s.skip(1)).buffer(2).subscribe{i -> print(i)}
s.onNext(1)
s.onNext(2)
s.onNext(3)
s.onNext(4)


Run Code Online (Sandbox Code Playgroud)

输出:
[1, 2][2, 3][3, 4]

val o = Observable.just(1,2,3,4)
o.mergeWith(o.skip(1)).buffer(2).subscribe{i -> print(i)}
Run Code Online (Sandbox Code Playgroud)

输出:
[1, 2][3, 4][2, 3][4]

(唯一的4个很好,并且是预期的)

And*_*ana 6

看起来你仍然可以使用缓冲区:

Observable.just(1, 2, 3, 4)
    .buffer(2, 1)
    .subscribe { println(it) }

// prints
// [1, 2]
// [2, 3]
// [3, 4]
// [4]
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,Skip 感觉像是一个可怕的命名。我假设缓冲区内的跳过值会执行与跳过运算符相同的操作。在Scala 中,这个参数称为step,这当然更加直观。(或者在机器学习领域取得更好的进步) (2认同)