看起来它们都给出了相同的结果.
scala> List(1,2,3)
res0: List[Int] = List(1, 2, 3)
scala> 0 +: res0
res1: List[Int] = List(0, 1, 2, 3)
scala> 0 :: res0
res2: List[Int] = List(0, 1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
对于我的新手,两种方法的源代码看起来相似(加冒号方法在使用构建器工厂的泛型方面具有附加条件).
应该使用以下哪种方法?
Dim*_*ima 23
+:适用于任何类型的集合,同时::具体实现List.如果你看一下源的+:观察,你会发现,它实际上是调用::时的预期收益类型List.这是因为::对于这种List情况更有效地实现:它只是将新头连接到现有列表并返回结果,这是一个恒定时间操作,而不是在通用情况下线性复制整个集合+:.
+:另一方面,拿CanBuildFrom,所以你可以做的事情(虽然,在这种情况下看起来不太好)的事情,如:
val foo: Array[String] = List("foo").+:("bar")(breakOut)
Run Code Online (Sandbox Code Playgroud)
(在这种特殊情况下它很无用,因为你可以从所需的类型开始,但你的想法是你可以在一个集合中添加前缀和元素,并在一个"go"中改变它的类型,避免额外的副本).