使用Scala中的Observable实现materialrate和foldLeft

时间:2013-12-06 19:48:19

标签: scala

为什么此代码永远不会触发订阅块?

Observable(1, 2, 3).materialize.foldLeft(0) { (acc, tn) =>
  tn match {
    case OnNext(n) => { println(acc, n); acc + n }
  }
}.subscribe({s => println("THIS IS NOT FIRED", s) })

这是输出: (0,1) (1,2) (3,3)

1 个答案:

答案 0 :(得分:0)

我也是斯卡拉的初学者,所以如果没有正确解释,请耐心等待 您似乎错过了onCompleted案例:

尝试使用:

 Observable(1, 2, 3).materialize.foldLeft(0) { (acc, tn) =>
   tn match {
   case Notification.OnNext(n)  => { println(acc, n); acc + n }
   case Notification.OnCompleted() => acc
  }
}.subscribe({s => println("THIS IS NOW FIRED", s) })

但是,因为从foldLeft返回的值基本上是一个(总和),如果我们按如下方式重写它,它会变得更具可读性:

   val sum = Observable(1, 2, 3).materialize.foldLeft(0) { (acc, tn) =>
       tn match {
       case Notification.OnNext(n)  => { println(acc, n); acc + n }
       case Notification.OnCompleted() => acc
      }
    }.toBlockingObservable.single

   println(sum) // prints 6

毋庸置疑,以前的解决方案只适用于流中没有元素引发错误的情况。

我发现this link非常有助于理解Observables。