2013-04-11 53 views
5

給定兩個清單aba ::: ba ++ b有什麼區別?我懷疑這些運營商的人會簡單地撥打對方,但事實上,這些實現看起來完全不同:列表中的:::和++有什麼區別?

def :::[B >: A](prefix: List[B]): List[B] = 
    if (isEmpty) prefix 
    else if (prefix.isEmpty) this 
    else (new ListBuffer[B] ++= prefix).prependToList(this) 

override def ++[B >: A, That](that: GenTraversableOnce[B]) 
         (implicit bf: CanBuildFrom[List[A], B, That]): That = { 
    val b = bf(this) 
    if (b.isInstanceOf[ListBuffer[_]])(this ::: that.seq.toList).asInstanceOf[That] 
    else super.++(that) 
} 

從使用的角度來看,我寧願a ::: ba ++ b?從實施的角度來看,這些運營商之一是不是簡單地打電話給其他公司的具體原因?

+0

[Scala list concatenation,::: vs ++]的可能重複(http://stackoverflow.com/questions/6559996/scala-list-concatenation-vs) – 2013-04-11 14:02:53

回答

10

區別在於您只能在2個列表上使用::: - 此操作僅在List數據類型上可用。由於列表是序列,因此它充當列表的串聯運算符。

++方法更通用 - 它允許創建任意兩個集合的聯合。這可能是兩個集合,在這種情況下它作爲一個聯合,或者兩個序列,在這種情況下,它作爲一個級聯。

有2只列出了++:::之間沒有語義差別 - :::++的功能列出了應該着眼於功能的程序員更熟悉的變種。

if聲明您在++執行看到的是一種優化 - 如果兩個this收集和that收集的名單,只是使用列表連接操作符:::到兩個列表相加。否則,請使用++的通用實現,將thisthat集合的所有元素添加到類型That的適當構建器。

因此,列表的相關差異是性能 - 對於功能列表,您不需要遍歷第二個列表,因爲通用的++實現將 - 只有第一個列表的節點需要重新實例化以創建新的功能列表。