chb*_*chb 11 scala for-comprehension scala-collections
我正在阅读斯卡拉的不耐烦,我遇到的东西让我摸不着头脑.
以下返回String:
scala> for ( c<-"Hello"; i <- 0 to 1) yield (c+i).toChar
res68: String = HIeflmlmop
Run Code Online (Sandbox Code Playgroud)
但是这会返回一个Vector:
scala> for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar
res72: scala.collection.immutable.IndexedSeq[Char] = Vector(H, e, l, l, o, I, f, m, m, p)
Run Code Online (Sandbox Code Playgroud)
这两个例子前面的文字是......
"当for循环的主体以yield开始时,循环构造一个值集合,每次迭代一个......这种类型的循环称为for comprehension.生成的集合与第一个生成器兼容.
如果生成的集合与第一个生成器兼容,那么为什么第二个示例不返回Range类型,如下所示:
scala> val range = 0 to 1
range: scala.collection.immutable.Range.Inclusive = Range(0, 1)
Run Code Online (Sandbox Code Playgroud)
或者我完全误解了文本的意思,"......生成的集合与第一个生成器兼容."
换内涵是脱了一系列的map,flatMap和filter操作。
当在上使用map时Range,您将获得Vector输出:
scala> 0 to 2 map (x => x * x)
res12: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 4)
Run Code Online (Sandbox Code Playgroud)
这是因为a Range是一种非常简单的集合,实际上仅是两个三个数字:一个起始值,一个结束值和一个步骤。如果查看上面的映射结果,可以看到结果值不能用某种Range类型的东西表示。