Ein anderer Punkt ist, dass der erste Satz wie folgt geparst wird:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Das zweite Beispiel hingegen wird geparst als:
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Wenn Sie also Makros verwenden, sollten Sie vorsichtig sein.
Außerdem, ++
für zwei Listen ist der Aufruf :::
aber mit mehr Overhead, weil es für einen impliziten Wert fragen, um einen Builder von Liste zu Liste haben. Aber Microbenchmarks haben nichts Nützliches in diesem Sinne bewiesen, ich vermute, dass der Compiler solche Aufrufe optimiert.
Micro-Benchmarks nach dem Aufwärmen.
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
Wie Daniel C. Sobrai sagte, können Sie den Inhalt einer beliebigen Sammlung an eine Liste anhängen, indem Sie ++
während bei :::
können Sie nur Listen miteinander verknüpfen.