Разница между СЛ и список в 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.
