Добавление элемента в неизменяемый 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?
Ответы
Ответ 1
Используйте оператор :+
(append), чтобы добавить элемент в Seq
:
Seq("a", "b") :+ "c"
Обратите внимание, что некоторые реализации Seq
более подходят для добавления, чем другие. List
оптимизирован для добавления. Vector
имеет быстрые операции добавления и добавления.
:::
- это метод на List
, который требует другого List
в качестве своего параметра - каковы преимущества, которые вы видите в нем, принимая другие типы последовательности? Он должен был преобразовать другие типы в List
. Если вы знаете, что List
эффективен для вашего случая использования, используйте :::
(если нужно). Если вы хотите получить полиморфное поведение, используйте общий ++
.
При использовании Nil
нет накладных расходов на создание экземпляра; вы не создаете экземпляр, потому что это синглтон.