58

比如说,我有一个字符串序列作为输入,我想获得一个新的不可变Seq对象,它由 input 和 item 的元素组成"c"。以下是我发现有效的两种方法:

  1. assert(Seq("a", "b", "c") == Seq("a", "b") ++ Seq("c"))- 这个问题是,似乎Seq("c")仅仅为了操作而实例化一个临时序列()是多余的,并且会导致开销
  2. assert(Seq("a", "b", "c") == List("a", "b") ::: "c" :: Nil)- 这将输入集合的类型限制为 a List,因此Seq("a", "b") ::: "c" :: Nil不起作用。此外,实例化 a 似乎也Nil可能导致开销

我的问题是:

  1. 还有其他方法可以执行此操作吗?
  2. 哪一个更好?
  3. Seq("a", "b") ::: Nil不被允许不是 Scala 开发人员的缺陷吗?
4

1 回答 1

123

使用:+(append) 运算符创建一个 Seq的使用:

val seq = Seq("a", "b") :+ "c"
// seq is now ("a","b","c")

注意::+ 将创建一个新Seq对象。如果你有

val mySeq = Seq("a","b")

你会打电话给

mySeq :+ "c"

mySeq仍将是("a","b")

请注意, 的某些实现Seq比其他实现更适合附加。List针对前置进行了优化。Vector具有快速追加和前置操作。

:::是一种List需要另一个List作为参数的方法 - 您在接受其他类型的序列时看到了什么优势?它必须将其他类型转换为List. 如果您知道这List对您的用例有效,请使用:::(如果必须)。如果您想要多态行为,请使用泛型++.

使用没有实例化开销Nil;你不实例化它,因为它是一个单例。

于 2011-11-28T12:21:54.660 回答