我查看了flatten的documentation,示例似乎表明结果中元素的顺序保持了输入的顺序。是否有我们可以参考的文档或源代码以确保是这种情况?或者,是文档"将这个可遍历集合的集合转换为由这些可遍历集合的元素组成的集合"足以证实这一点?
更新:我原来的问题不够明确。我想问一下内部维护订单的集合(比如List),我们在flatten()中使用默认的隐式遍历。 prayagupd已回答了这个问题。
答案 0 :(得分:2)
如果您阅读scala 2.12.x
的{{3}},则可以看到它按顺序将新输入的输入添加到新集合中。
//a sequential view of the collection
private def sequential: TraversableOnce[A] = this.asInstanceOf[GenTraversableOnce[A]].seq
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ GenTraversableOnce[B]): CC[B] = {
val b = genericBuilder[B]
for (xs <- sequential)
b ++= asTraversable(xs).seq
b.result()
}
您也可以通过示例进行验证,
scala> List(List("order1", "order2"), List("order10", "order11")).flatten
res1: List[String] = List(order1, order2, order10, order11)
即使您提供自己的可遍历
,订单也会保持不变scala> val asTraversable: List[String] => List[String] = list => list.map(elem => s"mutated $elem")
asTraversable: List[String] => List[String] = $$Lambda$1271/1988351538@513bec8c
scala> List(List("order1", "order2"), List("order10", "order11")).flatten(asTraversable)
res2: List[String] = List(mutated order1, mutated order2, mutated order10, mutated order11)
注意:以上仅适用于维护订单的基础数据结构。
例如Set
不维护订单
scala> Set(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).seq
res3: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)