Подтвердить что ты не робот

Добавление элемента в неизменяемый Seq

Скажем, у меня есть последовательность строк в качестве ввода, и я хочу получить новый неизменяемый 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 не будет работать. Также кажется, что создание экземпляра a Nil также может привести к накладным расходам

Мои вопросы:

  • Есть ли другой способ выполнения этой операции?
  • Какой из них лучше?
  • Не разрешено ли Seq("a", "b") ::: Nil недостаток разработчиков Scala?
4b9b3361

Ответ 1

Используйте оператор :+ (append), чтобы добавить элемент в Seq:

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

Обратите внимание, что некоторые реализации Seq более подходят для добавления, чем другие. List оптимизирован для добавления. Vector имеет быстрые операции добавления и добавления.

::: - это метод на List, который требует другого List в качестве своего параметра - каковы преимущества, которые вы видите в нем, принимая другие типы последовательности? Он должен был преобразовать другие типы в List. Если вы знаете, что List эффективен для вашего случая использования, используйте ::: (если нужно). Если вы хотите получить полиморфное поведение, используйте общий ++.

При использовании Nil нет накладных расходов на создание экземпляра; вы не создаете экземпляр, потому что это синглтон.