Scala列表连接,:::与++

17 浏览
0 Comments

Scala列表连接,:::与++

在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

文档来看,++更通用,而:::List特有的。是后者因为被其他函数式编程语言使用而被提供了吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

永远使用:::。原因有两个:效率和类型安全。

效率

x ::: y ::: zx ++ 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)

+++也容易混淆:

scala> List(1, 2, 3) + "ab"
res1: String = List(1, 2, 3)ab

0
0 Comments

传统的定义是,列表最初是为函数式语言而设计的:

1 :: 2 :: Nil // a list
list1 ::: list2  // concatenation of two lists
list match {
  case head :: tail => "non-empty"
  case Nil          => "empty"
}

当然,Scala是以一种临时的方式发展其他集合的。当2.8发布时,集合进行了重新设计,以实现最大的代码重用和一致的API,这样你就可以使用++来连接任何两个集合--甚至是迭代器。除一个或两个被废弃的操作符之外,List保留了其原始操作符。

0