Scala集合的flatten方法是否保留元素顺序?相关依据求证
你好,针对你关于Scala 2.12.3中flatten方法元素顺序的疑问,结合你补充的「List这类内部维护顺序的集合使用默认隐式可遍历实现」的场景,咱们可以从文档描述和源码实现两方面来确认:
一、官方文档描述的隐含保证
先看官方文档对flatten的定义:
将可遍历集合的集合转换为由这些可遍历集合的元素组成的集合
对于List这种天生维护固定线性顺序的集合,这个描述其实已经隐含了顺序一致性:外层集合的元素会按原有顺序被逐个处理,每个内部可遍历集合的元素也会按自身的顺序被取出追加到结果中,最终整体顺序完全匹配输入的嵌套结构顺序。
二、源码实现的直接佐证
咱们可以看Scala 2.12.3中GenericTraversableTemplate的flatten核心实现:
def flatten[B](implicit asTraversable: A => GenTraversableOnce[B]): CC[B] = { val b = genericBuilder[B] for (xs <- this) b ++= asTraversable(xs) b.result() }
这段代码的逻辑很清晰:
for (xs <- this)是按外层集合(比如List)的固有顺序遍历每个内部集合;b ++= asTraversable(xs)则是把每个内部集合的元素按其自身顺序依次追加到结果构建器中;- 最后通过
b.result()生成的集合,自然会完全保留输入的嵌套顺序。
而List对应的genericBuilder和CanBuildFrom实现,本身就是为了维护线性顺序设计的,所以完全不用担心顺序错乱的问题。
三、针对有序集合的额外说明
你聚焦的List这类有序集合,其默认flatten实现的顺序一致性是被设计层面保证的。只有当外层或内部集合本身是无序类型(比如HashSet)时,flatten的结果顺序才没有保证,但你的场景完全不涉及这类情况,所以文档描述和源码都能充分确认顺序和输入一致。
内容的提问来源于stack exchange,提问作者learnerer
相关产品推荐
相关产品推荐

