给定两个列表 a
和 b
, a ::: b
和有什么区别和 a ++ b
?我怀疑这些运算符中的一个会简单地调用另一个,但实际上,实现看起来完全不同:
def :::[B >: A](prefix: List[B]): List[B] =
if (isEmpty) prefix
else if (prefix.isEmpty) this
else (new ListBuffer[B] ++= prefix).prependToList(this)
override def ++[B >: A, That](that: GenTraversableOnce[B])
(implicit bf: CanBuildFrom[List[A], B, That]): That = {
val b = bf(this)
if (b.isInstanceOf[ListBuffer[_]])(this ::: that.seq.toList).asInstanceOf[That]
else super.++(that)
}
从使用的角度来看,我应该更喜欢
a ::: b
或 a ++ b
?从实现的角度来看,这些运算符中的一个不简单地调用另一个是否有特定的原因?
最佳答案
不同之处在于您只能使用 :::
在 2 个列表上 -- 此操作仅适用于 List
数据类型。由于列表是序列,因此它充当列表的连接运算符。++
方法更通用 - 它允许创建任何两个集合的联合。这可能是两个集合,在这种情况下它充当联合,或者两个序列,在这种情况下它充当串联。++
之间没有语义差异和 :::
对于 2 个列表 -- :::
是 ++
的变体对于函数式程序员来说应该更熟悉的函数式列表。if
您在 ++
中看到的声明实现是一种优化——如果两者都是 this
收藏和that
集合是列表,只需使用列表连接运算符 :::
将两个列表相加。否则,使用 ++
的通用实现将 this
的所有元素相加和 that
集合到类型 That
的适当构建器.
因此,列表的相关区别在于性能——对于功能列表,您不需要将第二个列表作为通用 ++
遍历。实现将 - 只有第一个列表的节点需要重新实例化以创建新的功能列表。
关于list - 列表的::: 和++ 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15948375/