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

dub*_*ech 4 scala

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

在Scala中,我说有两个列表

scala> val oneTwo = List(1,2)
oneTwo: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)

scala> val threeFour = List(3,4)
threeFour: List[Int] = List(3, 4)
Run Code Online (Sandbox Code Playgroud)

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

scala> oneTwo ::: threeFour
res30: List[Int] = List(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

要么

scala> oneTwo ++ threeFour
res31: List[Int] = List(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

两种方法有什么区别?

谢谢.

Dan*_*ral 9

:::方法是特定的List,同时++是任何方法的一部分Traversable.

差异源于两件事.首先,List是原始Scala集合之一,在编译器中经常使用,并且需要进行特殊优化.该::级联是在ML家族的语言,大斯卡拉灵感之一使用的相同,并:::从中推断.

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

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


Kyl*_*yle 6

来自文档:

::: [B>:A](前缀:List [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
Run Code Online (Sandbox Code Playgroud)