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

81 浏览
0 Comments

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

这个问题已经有了答案

可能是重复的问题:

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)

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

谢谢。

admin 更改状态以发布 2023年5月21日
0
0 Comments

文档中提到:

::: [B >: A](prefix : List[B]) : List[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
:10: error: value ::: is not a member of Array[Int]
              oneTwo ::: fiveSix

0
0 Comments

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

这两者的区别来自于两个方面。首先,List是最初的Scala集合之一,在编译器中得到了广泛使用,并受到特殊优化的影响。连接的::与ML语言家族中使用的相同,这是Scala的一个重要灵感来源,并且:::是从中推断出来的。

另一方面,++随着Scala 2.8.0中Scala集合的重新设计而出现,使方法和继承统一。我认为它在此之前就存在了(例如,在Set上),但集合没有共同的超类,因此它基本上是用于其他集合的一种特别方法。

就性能而言,:::应该优于++,但可能不显著。

0