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

Posted

技术标签:

【中文标题】Rxjava - 如何获取当前和上一个项目?【英文标题】:Rxjava - How to get the current and the previous item? 【发布时间】:2020-09-13 08:08:12 【问题描述】:

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

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

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

我考虑过将skipmergebuffer 结合使用,但合并似乎不能保证排序。

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


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

val o = Observable.just(1,2,3,4)
o.mergeWith(o.skip(1)).buffer(2).subscribei -> print(i)

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

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

【问题讨论】:

你试过buffer(2, 1)吗?此外,您可以使用scan。如果您对 C# 有点熟悉,请查看this 【参考方案1】:

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

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

// prints
// [1, 2]
// [2, 3]
// [3, 4]
// [4]

【讨论】:

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

以上是关于Rxjava - 如何获取当前和上一个项目?的主要内容,如果未能解决你的问题,请参考以下文章

查找当前版本和上一个版本之间的差异

c#:如何获取特定时间段的上一个年初至今和上一个月初至今?

如何从具有父子关系的模型中获取下一个和上一个记录

Oracle 获取当前组和上一个组(分区)平均值的差异

根据两个文本列排序的 SQL 获取下一行和上一行

WordPress 全屏图库 wordpress 插件 - 如何获取下一个和上一个按钮