在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你说得对!我将删除我的答案并发布另一个更通用的答案。