Un autre point est que la première phrase est analysée comme suit:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Alors que le deuxième exemple est analysé comme suit:
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Donc, si vous utilisez des macros, vous devez faire attention.
En outre, ++
pour deux listes appelle:::
mais avec plus de surcharge car cela demande une valeur implicite pour avoir un générateur de List en List. Mais les microbenchmarks n'ont rien prouvé d'utile dans ce sens, je suppose que le compilateur optimise de tels appels.
Micro-repères après échauffement.
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
Comme l'a dit Daniel C. Sobrai, vous pouvez ajouter le contenu de n'importe quelle collection à une liste en utilisant ++
, alors qu'avec :::
vous, vous ne pouvez concaténer que des listes.
:::
un opérateur de préfixe comme toutes les méthodes commençant par: