4

可能重复:
Scala 列表连接,::: vs ++

在 Scala 中,假设我有两个列表

scala> val oneTwo = List(1,2)
oneTwo: List[Int] = List(1, 2)

scala> val threeFour = List(3,4)
threeFour: List[Int] = List(3, 4)

我可以通过以下方式连接列表:

scala> oneTwo ::: threeFour
res30: List[Int] = List(1, 2, 3, 4)

或者

scala> oneTwo ++ threeFour
res31: List[Int] = List(1, 2, 3, 4)

两种方法有什么区别?

谢谢。

4

2 回答 2

9

:::方法特定于List++而是 any 的一部分Traversable

差异源于两件事。首先,List是原始的 Scala 集合之一,在编译器中使用很多,并且经过特殊优化。::串联与 ML 系列语言中使用的相同,这是 Scala 的一大灵感,并从中:::推断。

另一方面,++随着 Scala 2.8.0 对 Scala 集合的重新设计,方法和继承变得统一。我认为它在那之前就存在了(Set例如,在 上),但是这些集合没有共享一个共同的超类,所以它基本上是其他集合的一种临时方法。

在性能方面,:::应该会超过++,但可能不会显着。

于 2013-01-17T22:17:40.970 回答
6

从文档:

::: [B >: A](前缀:列表[B]):列表[B]

++ [B >: A](that : Iterable[B]) : List[B]

你可以看到++任何Iterable一段时间的作品:::是专门为List

scala> val oneTwo = List(1,2)
oneTwo: List[Int] = List(1, 2)

scala> val threeFour = List(3,4)
threeFour: List[Int] = List(3, 4)

scala> val fiveSix = Array(5,6)
fiveSix: Array[Int] = Array(5, 6)

scala> oneTwo ++ fiveSix
res2: List[Int] = List(1, 2, 5, 6)

scala> oneTwo ::: fiveSix
<console>:10: error: value ::: is not a member of Array[Int]
              oneTwo ::: fiveSix
于 2013-01-17T22:10:22.220 回答