Добавление элемента в неизменный Seq - PullRequest
52 голосов
/ 28 ноября 2011

Скажем, у меня есть последовательность строк в качестве ввода, и я хочу получить новый неизменяемый 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) - этот тип ограничивает тип входной коллекции как List, поэтому Seq("a", "b") ::: "c" :: Nil не будет работать. Также кажется, что создание Nil может также привести к накладным расходам

Мои вопросы:

  1. Есть ли другой способ выполнить эту операцию?
  2. Какой из них лучше?
  3. Разве Seq("a", "b") ::: Nil нельзя допустить недостаток разработчиков Scala?

1 Ответ

112 голосов
/ 28 ноября 2011

Используйте оператор :+ (добавление), чтобы создать новый 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;Вы не создаете экземпляр, потому что это синглтон.

...