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

标签 list scala operators

给定两个列表 ab , 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 ::: ba ++ b ?从实现的角度来看,这些运算符中的一个不简单地调用另一个是否有特定的原因?

最佳答案

不同之处在于您只能使用 :::在 2 个列表上 -- 此操作仅适用于 List数据类型。由于列表是序列,因此它充当列表的连接运算符。
++方法更通用 - 它允许创建任何两个集合的联合。这可能是两个集合,在这种情况下它充当联合,或者两个序列,在这种情况下它充当串联。
++ 之间没有语义差异和 :::对于 2 个列表 -- :::++ 的变体对于函数式程序员来说应该更熟悉的函数式列表。
if您在 ++ 中看到的声明实现是一种优化——如果两者都是 this收藏和that集合是列表,只需使用列表连接运算符 :::将两个列表相加。否则,使用 ++ 的通用实现将 this 的所有元素相加和 that集合到类型 That 的适当构建器.

因此,列表的相关区别在于性能——对于功能列表,您不需要将第二个列表作为通用 ++ 遍历。实现将 - 只有第一个列表的节点需要重新实例化以创建新的功能列表。

关于list - 列表的::: 和++ 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15948375/

相关文章:

java - Scala 中的端口扫描 : Application hangs for a closed port on the remote host

list - 如何区分 DART 中的复杂对象列表

java - 截至 2.11 版本,scala 反射功能(尤其是 wrt 注释)的(当前)状态如何?

python - 如何使用pythonlogging.info模块在文件中写入 'list data'

scala - 绕过 State 中的不变结果类型

f# - 传递 ** 作为参数

c - 逗号运算符 , 的作用是什么?

c++ - 重载运算符以允许 C++ 中参数的不同顺序

c# - 如何返回另一个列表中三个最低值的列表

python - 如何在 Python 中合并列表?合并 python 列表 (0,1,2) & (A,B,C) 以获得 (0A, 1B, 2C)