将项目添加到不可变的Seq
说,我有一个string序列作为input,我想获得一个新的不变的Seq
,它由input的元素和一个项目"c"
。 以下是我发现的两种方法:
-
assert(Seq("a", "b", "c") == Seq("a", "b") ++ Seq("c"))
– 这个问题似乎是实例化临时序列(Seq("c")
)仅仅是为了操作而是冗余的并且会导致开销 -
assert(Seq("a", "b", "c") == List("a", "b") ::: "c" :: Nil)
– 这个将input集合的types限制为List
,所以Seq("a", "b") ::: "c" :: Nil
将不起作用。 另外,似乎实例化一个Nil
可能会导致开销
我的问题是:
- 有没有其他的方式来执行这个操作?
- 哪一个更好?
- 不是
Seq("a", "b") ::: Nil
没有被允许Scala的开发人员的缺陷?
使用:+
(append)运算符将一个元素附加到Seq
:
Seq("a", "b") :+ "c"
请注意, Seq
一些实现比其他更适合于附加。 List
为预先优化。 Vector
有快速追加和prepend操作。
:::
是一个需要另一个List
作为参数的List
上的方法 – 你看到它在接受其他types的序列方面有哪些优点? 它将不得不将其他types转换为List
。 如果你知道List
对你的用例是有效的,那么使用:::
:(如果你必须的话)。 如果你想要多态的行为,那么使用通用的++
。
使用Nil
没有实例化开销; 你不要实例化它,因为它是一个单例。