Un altro punto è che la prima frase viene analizzata come:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Considerando che il secondo esempio è analizzato come:
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Quindi se stai usando le macro, dovresti prenderti cura.
Inoltre, ++
per due elenchi si chiama :::
ma con un overhead maggiore perché richiede un valore implicito per avere un builder da Elenco a Elenco. Ma i microbenchmark non si sono rivelati utili in tal senso, suppongo che il compilatore ottimizzi tali chiamate.
Micro-benchmark dopo il riscaldamento.
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
Come ha detto Daniel C. Sobrai, puoi aggiungere il contenuto di qualsiasi raccolta a un elenco usando ++
, mentre con :::
te puoi solo concatenare elenchi.
:::
è un operatore di prefisso come tutti i metodi che iniziano con: