Ein anderer Punkt ist, dass der erste Satz wie folgt analysiert wird:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Während das zweite Beispiel wie folgt analysiert wird:
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 wird ++
für zwei Listen aufgerufen, :::
jedoch mit mehr Overhead, da nach einem impliziten Wert gefragt wird, um einen Builder von Liste zu Liste zu haben. Aber Mikrobenchmarks haben sich in diesem Sinne nicht als nützlich erwiesen. Ich denke, der Compiler optimiert solche Aufrufe.
Mikro-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 jeder Sammlung mit an eine Liste anhängen ++
, während :::
Sie damit nur Listen verketten können.
:::
ist ein Präfix-Operator wie alle Methoden beginnend mit: