Інший момент полягає в тому, що перше речення аналізується як:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Тоді як другий приклад аналізується як:
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Тож якщо ви використовуєте макроси, вам слід подбати.
Крім того, ++
для двох списків дзвінки, :::
але з більшою накладною витратою, тому що він просить неявного значення мати будівельника зі списку в список. Але мікроблоки не виявили нічого корисного в цьому сенсі, я думаю, що компілятор оптимізує такі дзвінки.
Мікро-орієнтири після прогрівання.
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
Як сказав Даніель С. Собрай, ви можете додати вміст будь-якої колекції до списку, використовуючи ++
, тоді як з ними :::
ви можете лише об'єднати списки.
:::
є оператор префікса, як і всі методи, починаючи з: