2013-01-17 25 views
4

可能重复:
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) 

是什么这两种方法之间的区别?

谢谢。

回答

9

:::方法特定于List,而++是任何Traversable的一部分。

区别产生于两件事。首先,List是原始Scala集合之一,在编译器中使用了很多,并受到特殊优化。 ::级联与ML语言家族中使用的相同,这是Scala大型灵感之一,而:::则是从中推断出来的。

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

在性能方面,:::应该击败++,但可能并不显着。

6

从文档:

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

++ [B>:A](即:可迭代[B]):列表[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