Ответы:
С точки зрения 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
является подходящим обобщением для случаев, когда параллелизм кода не имеет значения. Они оба относительно недавно введены, поэтому люди еще не пользуются ими.
UnsupportedOperationException
из-за этого. Для создания неизменяемого списка в Java вы используете Collections.unmodifiableList () и аналогичным образом есть другие методы для Наборов, Карт и т. Д. Docs.oracle.com/javase/6/docs/api/java/util/…
СтартПослед является Iterable , что имеет определенный порядок элементов. Последовательности обеспечивают метод apply()
индексации, начиная от 0 до длины последовательности. Seq имеет много подклассов, включая Queue, Range, List, Stack и LinkedList.
Список является Seq , который реализован в виде неизменного связанного списка. Лучше всего его использовать в случаях с шаблонами доступа «последний пришел - первым вышел» (LIFO).
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
.
В Scala List наследуется от Seq, но реализует Product ; Вот правильное определение List :
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[Примечание: фактическое определение . Это чуть немного сложнее, для того , чтобы вписаться в и использовать очень мощные рамки коллекции в 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
следовательно, можно написать:
var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
В результате, я бы сказал, что единственное, что имеет значение, - это методы, которые вы хотите раскрыть, например, предисловие, которое вы можете использовать ::
из списка, который я считаю избыточным +:
из Seq, и я лично придерживаюсь Seq по умолчанию.
String
это и не коллекция, это пример неизменяемых классов, знакомых программистам на Java.