Rxjava - Как получить текущий и предыдущий элемент?

Как использовать операторы, чтобы всегда получать предыдущее и текущее значение? Если возможно, я хочу избежать создания состояния за пределами трубы.

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

Обратите внимание, что каждое значение, кроме первого и последнего, должно появляться дважды, поэтому простой буфер не подходит.

Я думал об объединении skip с merge и 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)


вывод:
[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)}

вывод:
[1, 2] [3, 4] [2, 3] [4]

(единственная 4 в порядке и ожидаемо)


person Voidcrawler    schedule 26.05.2020    source источник
comment
Вы пробовали buffer(2, 1)? Также вы можете использовать scan. Если вы немного знакомы с C #, ознакомьтесь с этим   -  person momt99    schedule 26.05.2020


Ответы (1)


Похоже, вы все еще можете использовать буфер:

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

// prints
// [1, 2]
// [2, 3]
// [3, 4]
// [4]
person Andrei Tanana    schedule 26.05.2020
comment
В этом контексте Скип кажется ужасным наименованием. Я предполагал, что значение пропуска в буфере будет делать то же самое, что и оператор пропуска. В Scala этот параметр называется шагом, что, безусловно, гораздо более интуитивно понятно. (Или даже лучший шаг в области ml) - person Voidcrawler; 02.06.2020