2016-12-27 34 views
10

我對+:::運營商有點困惑。斯卡拉名單 - 加冒號與雙冒號(+:vs::)

看起來他們倆都給出了相同的結果。

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) 

對於這兩種方法我的新手眼的源代碼類似於(加冒號方法與使用製造商工廠的仿製藥的附加條件)。

哪一種方法應該使用?

+0

一個好的開始:用'Seq'而不是'List'嘗試同樣的事情... –

回答

11

+:適用於任何種類的收集,而::List的具體實施。 如果仔細查看+:source,您會注意到,當預期返回類型爲List時,實際上它會調用::。這是因爲對於List情況,::的執行效率更高:它只是將新磁頭連接到現有列表並返回結果,這是一個常量操作,而不是線性複製一般情況下的整個集合+:

,另一方面+:,需要CanBuildFrom,所以你可以做花哨的(雖然,在此情況下,看上去很好)之類的東西:

val foo: Array[String] = List("foo").+:("bar")(breakOut) 

(這是在這種特殊情況下沒什麼用,因爲你可以從所需的類型開始,但想法是可以預先加入元素並將其添加到集合中,然後將其類型更改爲「去」,避免額外的副本)。