Un punto diferente es que la primera oración se analiza como:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Mientras que el segundo ejemplo se analiza como:
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Entonces, si está utilizando macros, debe tener cuidado.
Además, ++
para dos listas se llama :::
pero con más sobrecarga porque se pide un valor implícito para tener un generador de Lista a Lista. Pero los microbenchmarks no probaron nada útil en ese sentido, supongo que el compilador optimiza tales llamadas.
Micro-puntos de referencia después del calentamiento.
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
Como dijo Daniel C. Sobrai, puede agregar el contenido de cualquier colección a una lista usando ++
, mientras que con :::
solo puede concatenar listas.
:::
es un operador de prefijo como todos los métodos que comienzan con: