列表的:::和++之间有什么区别?

时间:2013-04-11 12:06:37

标签: list scala operators

鉴于两个列表aba ::: ba ++ 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?从实现的角度来看,是否有一个特定的原因,为什么其中一个运算符不会简单地调用另一个?

1 个答案:

答案 0 :(得分:11)

不同之处在于您只能在2个列表上使用::: - 此操作仅适用于List数据类型。由于列表是序列,因此它充当列表的连接运算符。

++方法更通用 - 它允许创建任意两个集合的并集。这可能是两组,在这种情况下,它充当一个联合,或两个序列,在这种情况下,它充当连接。

对于2个列表,++:::之间没有语义差异 - :::是函数列表++的变体,对功能程序员来说应该更熟悉

您在if实现中看到的++语句是一种优化 - 如果this集合和that集合都是列表,只需使用list concatenation operator { {1}}将两个列表一起添加。否则,请使用:::的通用实现,该实现将++this集合的所有元素添加到类型that的相应构建器中。

因此,列表的相关差异是性能 - 对于功能列表,您不需要像通用That实现那样遍历第二个列表 - 只需要将第一个列表中的节点重新实例化为创建一个新的功能列表。