Say, I have a sequence of strings as an input and I want to get a new immutable Seq
which consists of elements of the input and an item "c"
. Here are two methods that I've discovered to be working:
assert(Seq("a", "b", "c") == Seq("a", "b") ++ Seq("c"))
- the problem with this one is that it seems that instantiating a temporary sequence (Seq("c")
) just for the sake of the operation is rendundant and will result in overheadassert(Seq("a", "b", "c") == List("a", "b") ::: "c" :: Nil)
- this one restricts the type of input collection to be a List
, so Seq("a", "b") ::: "c" :: Nil
won't work. Also it seems that instantiating a Nil
may aswell result in overheadMy questions are:
Seq("a", "b") ::: Nil
not being allowed a flaw of Scala's developers?Use the :+ Operator to Append an Element to a Sequence in Scala. Scala provides the :+ operator to append a single element to the sequence or a vector.
This is the first method we use to append Scala List using the operator “:+”. The syntax we use in this method is; first to declare the list name and then use the ':+' method rather than the new element that will be appended in the list. The syntax looks like “List name:+ new elements”.
Seq is immutable — Once a Seq is created, it cannot be changed, appended to, rearranged or otherwise modified.
Seq which represents sequences that are guaranteed immutable. Sequences are special cases of iterable collections of class Iterable . Unlike iterables, sequences always have a defined order of elements. Sequences provide a method apply for indexing.
Use the :+
(append) operator to create a new Seq
using:
val seq = Seq("a", "b") :+ "c" // seq is now ("a","b","c")
Note: :+
will create a new Seq
object. If you have
val mySeq = Seq("a","b")
and you will call
mySeq :+ "c"
mySeq
will still be ("a","b")
Note that some implementations of Seq
are more suitable for appending than others. List
is optimised for prepending. Vector
has fast append and prepend operations.
:::
is a method on List
which requires another List
as its parameter - what are the advantages that you see in it accepting other types of sequence? It would have to convert other types to a List
. If you know that List
is efficient for your use case then use :::
(if you must). If you want polymorphic behaviour then use the generic ++
.
There's no instantiation overhead to using Nil
; you don't instantiate it because it's a singleton.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With