将项目添加到不可变的Seq

说,我有一个string序列作为input,我想获得一个新的不变的Seq ,它由input的元素和一个项目"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) – 这个将input集合的types限制为List ,所以Seq("a", "b") ::: "c" :: Nil将不起作用。 另外,似乎实例化一个Nil可能会导致开销

我的问题是:

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

使用:+ (append)运算符将一个元素附加到Seq

 Seq("a", "b") :+ "c" 

请注意, Seq一些实现比其他更适合于附加。 List为预先优化。 Vector有快速追加和prepend操作。

:::是一个需要另一个List作为参数的List上的方法 – 你看到它在接受其他types的序列方面有哪些优点? 它将不得不将其他types转换为List 。 如果你知道List对你的用例是有效的,那么使用::: :(如果你必须的话)。 如果你想要多态的行为,那么使用通用的++

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