将项添加到不可变的Seq

时间:2011-11-28 12:09:25

标签: list scala seq

说,我有一系列字符串作为输入,我想得到一个新的不可变Seq,它由输入元素和项"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) - 这个将输入集合的类型限制为List,因此Seq("a", "b") ::: "c" :: Nil将无效。此外,似乎实例化Nil也可能导致开销
  3. 我的问题是:

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

1 个答案:

答案 0 :(得分:112)

使用:+(追加)运算符创建 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没有实例化开销;你没有实例化它,因为它是一个单身人士。