让我们说我们有来源的Observable:
this
我想创建另一个Observable,生成的值与 source 中第一个出现的值的差值大于10:
val source:Observable[Int]
我在这里使用var start 来保存 source Observable的第一个值。
有没有办法简化这段代码?我不喜欢这种方法,为var
赋值答案 0 :(得分:3)
以下是我提出的建议:
import rx.lang.scala.Observable
val source = Observable.from(List(5, 2, 3, 16, -40, 2, -70, 50))
source.scan(Option.empty[(Int, Int)]) { (acc, next) =>
acc.map(_.copy(_2 = next)) orElse Some((next, next))
}.collect {
case Some((start, current)) if math.abs(start - current) > 10 => current
}.subscribe(x => println(x))
打印
16
-40
-70
50
基本上扫描会保留一个可以未初始化(None
)的累加器,或者可以保持一对:第一个值和从源发出的最后一个元素。然后我们只收集那些符合你的谓词的元素。
答案 1 :(得分:0)
您只需要应用read
运算符,该运算符生成一个新的Observable,它反映了源可观察量的排放,但跳过谓词测试为false的那些:
filter