跳至主要内容

Pazzled by Observables

如果创建两个 `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` 调用,所以两个版本作用是一样的。 尚未完全了解为什么后两种都不工作。

评论