Lui*_*hys 345 scala list concatenation
在Scala中连接列表:::
和++
列表之间是否有任何区别?
scala> List(1,2,3) ++ List(4,5)
res0: List[Int] = List(1, 2, 3, 4, 5)
scala> List(1,2,3) ::: List(4,5)
res1: List[Int] = List(1, 2, 3, 4, 5)
scala> res0 == res1
res2: Boolean = true
Run Code Online (Sandbox Code Playgroud)
从文档看起来++
是更普遍的,而:::
是List
特异性的.提供后者是因为它用于其他功能语言吗?
Dan*_*ral 304
遗产.列表最初定义为功能语言:
1 :: 2 :: Nil // a list
list1 ::: list2 // concatenation of two lists
list match {
case head :: tail => "non-empty"
case Nil => "empty"
}
Run Code Online (Sandbox Code Playgroud)
当然,Scala以临时方式演变了其他集合.当2.8出来时,这些集合经过重新设计,以实现最大程度的代码重用和一致的API,因此您可以使用它++
来连接任何两个集合 - 甚至是迭代器.然而,列表必须保留其原始运营商,除了一两个被弃用的运营商.
par*_*tic 83
:::
仅适用于列表,同时++
可以与任何可遍历使用.在当前的实现(2.9.0),++
倒在:::
如果参数也是List
.
Zhe*_*lov 81
一直用:::
.有两个原因:效率和类型安全.
效率
x ::: y ::: z
是快于x ++ y ++ z
,因为:::
是正确的联想.x ::: y ::: z
被解析为x ::: (y ::: z)
,在算法上比(x ::: y) ::: z
(后者需要O(| x |)更多的步骤更快).
类型安全
随着:::
你只能连接两个List
秒.随++
你可以附加任何集合List
,这是可怕的:
scala> List(1, 2, 3) ++ "ab"
res0: List[AnyVal] = List(1, 2, 3, a, b)
Run Code Online (Sandbox Code Playgroud)
++
也容易混淆+
:
scala> List(1, 2, 3) + "ab"
res1: String = List(1, 2, 3)ab
Run Code Online (Sandbox Code Playgroud)
Mik*_*yer 20
另一点是第一句被解析为:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)
而第二个例子被解析为:
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)
所以如果你使用宏,你应该小心.
此外,++
两个列表正在调用:::
但具有更多开销,因为它要求一个隐式值以从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
Run Code Online (Sandbox Code Playgroud)
正如Daniel C. Sobrai所说,您可以使用任何集合的内容附加到列表中++
,而:::
您只能连接列表.
归档时间: |
|
查看次数: |
154499 次 |
最近记录: |