用于连接列表的:::和++之间的区别

时间:2013-01-17 21:56:34

标签: scala

  

可能重复:
  Scala list concatenation, ::: 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)

两种方法有什么区别?

感谢。

2 个答案:

答案 0 :(得分:9)

:::方法特定于List,而++则属于任何Traversable

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

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

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

答案 1 :(得分:6)

来自文档:

  

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

     

++ [B>:A](即: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