異なる点は、最初の文が次のように解析されることです。
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
一方、2番目の例は次のように解析されます。
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
したがって、マクロを使用している場合は注意が必要です。
さらに、++
2つのリストが呼び出されますが、リスト:::
からリストへのビルダーを持つように暗黙の値を要求しているため、オーバーヘッドが大きくなります。しかし、マイクロベンチマークはその意味で有用なものを何も証明していませんでした。コンパイラがそのような呼び出しを最適化していると思います。
ウォームアップ後のマイクロベンチマーク。
scala>def time(a: => Unit): Long = { val t = System.currentTimeMillis; a; System.currentTimeMillis - t}
scala>def average(a: () => Long) = (for(i<-1 to 100) yield a()).sum/100
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ++ List(e) } })
res1: Long = 46
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ::: List(e ) } })
res2: Long = 46
ダニエル・C. Sobraiが言ったように、あなたが使用してリストに任意のコレクションのコンテンツを追加することができます++
とのに対し、:::
あなただけのCONCATENATEリストすることができます。
:::
始まるすべてのメソッドのような接頭辞演算子である: