说,我有一系列字符串作为输入,我想得到一个新的不可变Seq
,它由输入元素和项"c"
组成。以下是我发现的两种方法:
assert(Seq("a", "b", "c") == Seq("a", "b") ++ Seq("c"))
- 这个问题的一个问题是,似乎仅仅为了操作而实例化一个临时序列(Seq("c")
)是一种冗余并且会导致开销assert(Seq("a", "b", "c") == List("a", "b") ::: "c" :: Nil)
- 这个将输入集合的类型限制为List
,因此Seq("a", "b") ::: "c" :: Nil
将无效。此外,似乎实例化Nil
也可能导致开销我的问题是:
Seq("a", "b") ::: Nil
不允许Scala开发人员的缺陷吗?答案 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
没有实例化开销;你没有实例化它,因为它是一个单身人士。