Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中可观察的物化和折叠_Scala - Fatal编程技术网

在Scala中可观察的物化和折叠

在Scala中可观察的物化和折叠,scala,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)我也是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)

我也是Scala的初学者,如果有什么解释不正确,请容忍我。
您似乎缺少了未完成的
案例:

尝试以下方法:

 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
不用说,前面的解决方案仅适用于流中没有引起错误的元素的情况


我发现理解观测值非常有帮助。

这看起来像是一个家庭作业问题,可能应该删除?@jabley你说得对!我将删除我的答案并发布另一个更通用的答案。