Scala 如何从另一个观察到一个

Scala 如何从另一个观察到一个,scala,rx-java,rx-scala,Scala,Rx Java,Rx Scala,假设我们有整数的可观测源: val source:Observable[Int] 我想创建另一个可观察值,生成与源处首次出现的值的差值大于10的值: def detect() = Observable[Int]( subscriber => if (!subscriber.isUnsubscribed) { var start:Option[Int] = None source.subscribe( item => {

假设我们有整数的可观测源:

val source:Observable[Int]
我想创建另一个可观察值,生成与源处首次出现的值的差值大于10的值:

def detect() = Observable[Int](
  subscriber =>
    if (!subscriber.isUnsubscribed) {
      var start:Option[Int] = None
      source.subscribe(
        item => {
          if (start.isEmpty) {
            start = Option(item)
          }
          else {
            start.filter(v => Math.abs(item - v) > 10).foreach {
              item => subscriber.onNext(item)
            }
          }
        }
      )
      subscriber.onCompleted()
    }
)
在这里,我使用var start来保存源可观测值的第一个值


有没有办法简化这段代码?我不喜欢这种将值分配给var的方法,您只需要应用
过滤器
操作符,它生成一个新的可观测值,反映源可观测值的发射,但跳过谓词测试为false的那些值:

val filtered = source.filter(v => Math.abs(item - v) > 10)

以下是我的想法:

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

基本上,scan保留一个可以取消初始化的累加器(
None
),或者可以保存一对:第一个值和源发出的最后一个元素。然后,我们只收集符合your谓词的元素。

如何保存source的第一个值?我将source的每个下一个值与第一个值进行比较