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


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

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

4 231

4 ответа:

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

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

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

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

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

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

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

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

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

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

enter image description here

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

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

[Примечание: the фактический определение немного сложнее, чтобы соответствовать и использовать очень мощную структуру коллекции 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.