Разница между Seq и списком в Scala

Я видел во многих примерах, что иногда используется Seq, а в других случаях-список...

есть ли разница, кроме того, что первый из них является типом Scala и списком, поступающим с Java?

4 ответов


в терминах Java, Scala Seq будет Java List, и будет Java LinkedList.

отметим, что Seq Это trait, что эквивалентно Java interface, но с эквивалентом перспективных методов defender. Скала List - абстрактный класс, который расширяется на Nil и ::, которые являются конкретными реализациями List.

Итак, где Java List это interface, это реализация.

помимо этого, Скала List является неизменяемым, что не относится к LinkedList. Фактически, Java не имеет эквивалента неизменяемым коллекциям (только для чтения гарантирует, что новый объект не может быть изменен, но вы все равно можете изменить старый, и, следовательно, "только для чтения").

Скала List сильно оптимизирован компилятором и библиотеками, и это основной тип данных в функциональном программировании. Однако она имеет ограничения и это недостаточно для параллельного программирования. В эти дни, Vector лучше, чем List, но привычку трудно сломать.

Seq является хорошим обобщением для последовательностей, поэтому, если вы программируете на интерфейсы, вы должны использовать это. Обратите внимание, что на самом деле их три: collection.Seq, collection.mutable.Seq и collection.immutable.Seq, и именно последний является" по умолчанию", импортированным в область видимости.

там же GenSeq и ParSeq. Последние методы работают параллельно, где это возможно, в то время как первый является родителем для обоих Seq и ParSeq, будучи подходящим обобщением для того, когда параллелизм кода не имеет значения. Они оба относительно недавно введены, поэтому люди пока не используют их много.


на Seq является Iterable, который имеет определенный порядок элементов. Последовательности предоставляют метод apply() для индексирования, начиная от 0 до длины последовательности. Seq имеет много подклассов, включая очередь, диапазон, список, стек и LinkedList.

на список - Это Seq, который реализован как неизменяемый связанный список. Его лучше всего использовать в случаях с шаблонами доступа last-in first-out (LIFO).

вот полная иерархия классов коллекции от Scala FAQ:

enter image description here


в Scala список наследуется от Seq, но реализует продукт; вот правильное определение список :

sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...

[Примечание: на фактический определение немного сложнее, чтобы соответствовать и использовать очень мощную структуру коллекции Scala.]


Seq - это черта, которая List реализует.

если вы определяете контейнер как Seq, вы можете использовать любой контейнер, который реализует Seq черта.

scala> def sumUp(s: Seq[Int]): Int = { s.sum }
sumUp: (s: Seq[Int])Int

scala> sumUp(List(1,2,3))
res41: Int = 6

scala> sumUp(Vector(1,2,3))
res42: Int = 6

scala> sumUp(Seq(1,2,3))
res44: Int = 6

отметим, что

scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)

- это просто сокращенная:

scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)

если тип контейнера не указана, базовая структура данных по умолчанию:List.