Um ponto diferente é que a primeira frase é analisada como:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Enquanto o segundo exemplo é analisado como:
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Portanto, se você estiver usando macros, tome cuidado.
Além disso, ++
para duas listas está chamando, :::
mas com mais sobrecarga porque está solicitando um valor implícito para ter um construtor de Lista para Lista. Mas as marcas de microbench não provaram nada de útil nesse sentido, acho que o compilador otimiza essas chamadas.
Micro-benchmarks após o aquecimento.
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 Daniel C. Sobrai disse, você pode anexar o conteúdo de qualquer coleção a uma lista usando ++
, enquanto que :::
você só pode concatenar listas.
:::
é um operador de prefixo, como todos os métodos iniciados com: