如果创建两个 `Observable`,分别用 `foldLeft` 计数和求和。
val summingObservable = Observable(1 to 64).foldLeft(0)((v, i) => v + i)
val countingObservable = Observable(1 to 100).foldLeft(0)((v, _) => v + 1)
结果需要一个字符串,将这两个计算结果报告出来。
尝试了一些不同的方式,有的可以工作
// Solution 1 - OK
val finalObservable: Observable[(Int, Int)] = summingObservable.zip(countingObservable)
finalObservable.foreach(println(_))
// Solution 2 - OK
val sum: Seq[Int] = Await.result(summingObservable.toFuture(), Duration.Inf)
val count: Seq[Int] = Await.result(countingObservable.toFuture(), Duration.Inf)
println(s"sum = ${sum.head}, count = ${count.head}")
而另一些则不行:
// Solution 3.a - KO
val finalObservable: Observable[String] = for {
sum <- summingObservable
count <- countingObservable
} yield (s"sum = $sum, count = $count")
finalObservable.foreach(println(_))
// Solution 3.b - KO
val result: Observable[String] = summingObservable.flatMap((sum: Int) =>
countingObservable.map((count: Int) =>
s"sum = $sum, count = $count"
)
)
result.println(result)
实际上 for-comprehension 会被翻译为 `flatMap` 和 `map` 调用,所以两个版本作用是一样的。
尚未完全了解为什么后两种都不工作。
评论