一个不同的观点是,第一句话被解析为:
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)
如果您正在使用宏,那么您应该小心。
此外,对于两个列表的++
操作会调用:::
,但是由于它要求从List到List的构建器具有隐式值,因此会增加更多开销。但是微基准测试没有证明任何有用的东西,我想编译器会优化这种调用。
在预热后进行微基准测试。
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
正如Daniel C. Sobrai所说,您可以使用
++
将任何集合的内容附加到列表中,而使用
:::
只能连接列表。
:::
也是一个前缀操作符,就像所有以:
开头的方法一样。 - Ben Jackson