将项添加到不可变的Seq

Nik*_*kov 52 scala list 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)- 这个将输入集合的类型限制为a List,因此Seq("a", "b") ::: "c" :: Nil不起作用.此外,似乎实例化a Nil也可能导致开销

我的问题是:

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

Ben*_*mes 114

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

val seq = Seq("a", "b") :+ "c"
// seq is now ("a","b","c")
Run Code Online (Sandbox Code Playgroud)

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

val mySeq = Seq("a","b")
Run Code Online (Sandbox Code Playgroud)

你会打电话

mySeq :+ "c"
Run Code Online (Sandbox Code Playgroud)

mySeq 仍然会 ("a","b")

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

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

使用时没有实例化开销Nil; 你没有实例化它,因为它是一个单身人士.