Я видел во многих примерах, что иногда используется Seq, а в других случаях это список ...
Есть ли какая-то разница, кроме того, что предыдущий является типом Scala и List поступает с Java?
источник
Я видел во многих примерах, что иногда используется Seq, а в других случаях это список ...
Есть ли какая-то разница, кроме того, что предыдущий является типом Scala и List поступает с Java?
С точки зрения Java, Scala Seq
будет Java List
, а Scala List
будет Java LinkedList
.
Обратите внимание, что Seq
это trait
, что эквивалентно Java interface
, но с эквивалентом новых методов защиты. Scala List
- это абстрактный класс, который расширяется на Nil
и и ::
который является конкретной реализацией List
.
Итак, где Java List
- это interface
Scala List
- это реализация.
Помимо этого, Scala's List
является неизменным, что не так LinkedList
. Фактически, Java не имеет эквивалента неизменным коллекциям (только для чтения гарантирует, что новый объект не может быть изменен, но вы все равно можете изменить старый и, следовательно, «только для чтения»).
Scala List
сильно оптимизированы компилятором и библиотеками, и это фундаментальный тип данных в функциональном программировании. Однако у него есть ограничения, и он не подходит для параллельного программирования. В наши дни Vector
это лучший выбор List
, но привычку трудно сломать.
Seq
является хорошим обобщением для последовательностей, поэтому, если вы программируете на интерфейсы, вы должны использовать это. Обратите внимание , что есть на самом деле три из них: collection.Seq
, collection.mutable.Seq
и collection.immutable.Seq
, и это тот один , который является « по умолчанию» импортирован в область видимости.
Там же GenSeq
и ParSeq
. Последние методы работают параллельно, где это возможно, в то время как первый является родительским для обоих Seq
и ParSeq
является подходящим обобщением для случаев, когда параллелизм кода не имеет значения. Они оба относительно недавно введены, поэтому люди еще не пользуются ими.
String
это и не коллекция, это пример неизменяемых классов, знакомых программистам на Java.UnsupportedOperationException
из-за этого. Для создания неизменяемого списка в Java вы используете Collections.unmodifiableList () и аналогичным образом есть другие методы для Наборов, Карт и т. Д. Docs.oracle.com/javase/6/docs/api/java/util/…СтартПослед является Iterable , что имеет определенный порядок элементов. Последовательности обеспечивают метод
apply()
индексации, начиная от 0 до длины последовательности. Seq имеет много подклассов, включая Queue, Range, List, Stack и LinkedList.Список является Seq , который реализован в виде неизменного связанного списка. Лучше всего его использовать в случаях с шаблонами доступа «последний пришел - первым вышел» (LIFO).
Вот полная иерархия классов коллекции из FAQ по Scala :
источник
Seq
это черта, котораяList
реализует.Если вы определите свой контейнер как
Seq
, вы можете использовать любой контейнер, который реализуетSeq
черту.Обратите внимание, что
Это просто короткая рука для:
если тип контейнера не указан, базовой структурой данных по умолчанию является
List
.источник
В Scala List наследуется от Seq, но реализует Product ; Вот правильное определение List :
[Примечание: фактическое определение . Это чуть немного сложнее, для того , чтобы вписаться в и использовать очень мощные рамки коллекции в Scala]
источник
Как сказал @ daniel-c-sobral, List расширяет черту Seq и является абстрактным классом, реализуемым
scala.collection.immutable.$colon$colon
(или::
для краткости), но, за исключением технических аспектов, помните, что большинство используемых нами списков и seqs инициализируются в формеSeq(1, 2, 3)
илиList(1, 2, 3)
которые оба возвращаютscala.collection.immutable.$colon$colon
следовательно, можно написать:В результате, я бы сказал, что единственное, что имеет значение, - это методы, которые вы хотите раскрыть, например, предисловие, которое вы можете использовать
::
из списка, который я считаю избыточным+:
из Seq, и я лично придерживаюсь Seq по умолчанию.источник