Разница между СЛ и список в Scala
Я видел во многих примерах, что иногда используется Seq, а в других случаях-список...
есть ли какая-либо разница, кроме первого типа Scala и списка, поступающего из Java?
4 ответа:
в терминах Java, Scala
Seq
было бы JavaList
, и будет JavaLinkedList
.отметим, что
Seq
Этоtrait
, что эквивалентно Javainterface
, но с эквивалентом методов восходящего защитника. Скала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:
в 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
.