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

Я видел во многих примерах, что иногда используется Seq, а в других случаях – List …

Есть ли какая-то разница, отличная от прежней, которая является типом Scala и List, поступающим с Java?

С точки зрения Java, Seq Scala будет List Java, а Scala’s List будет LinkedList Java.

Обратите внимание, что Seq – это trait , который эквивалентен interface Java, но с эквивалентом методов и способов защиты вверх и вниз. Scala’s List – это абстрактный class, который расширен Nil и :: , которые являются конкретными реализациями List .

Итак, когда Java- List является interface , Scala’s List представляет собой реализацию.

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

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

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

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

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

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

Ниже приведена полная иерархия classов коллекции из часто задаваемых вопросов Scala :

введите описание изображения здесь

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

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

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

Это всего лишь короткая arm для:

 scala> val a: Seq[Int] = List(1,2,3) a: Seq[Int] = List(1, 2, 3) 

если тип контейнера не указан, базовая структура данных по умолчанию соответствует List .

  • Связанная функция списка списков и обратные результаты
  • Доступ к индексу в циклах 'for'?
  • Конкатенация списка Scala, ::: vs ++
  • Android Swipe в списке
  • C # - элегантный способ разделения списка?
  • Как создать раскрывающийся список?
  • Запись и чтение списка из файла
  • В чем разница между неограниченным подстановочным типом List И сырым списком типов?
  • Проверьте, содержит ли список любой другой список
  • C #: Как преобразовать список объектов в список одного свойства этого объекта?
  • Как удалить строки между ListViews на Android?
  • Interesting Posts

    Почему я не должен использовать символы Unicode для имитации типографских стилей (например, небольших кепок или скриптов)?

    Как загрузить последние вкладки в Chrome с помощью файлов Last Tabs, Last Session?

    Как создать электронное письмо со встроенными изображениями, совместимое с большинством почтовых клиентов

    Как сгруппировать по 2 дочерним объектам и получить общее количество обоих этих дочерних объектов?

    Angular2: приложение аварийно завершает работу / становится невосприимчивым после обнаружения исключения / ошибки

    Копировать конструктор и = перегрузка оператора в C ++: возможна ли общая функция?

    Проблема GCC: использование члена базового classа, который зависит от аргумента шаблона

    интерактивная область изображения

    libxml / tree.h нет такого файла или каталога

    Как я могу использовать Android KeyStore для безопасного хранения произвольных строк?

    Почему сценарий Ajax не работает на сервере IIS 7.5 Win 2008 R2?

    Как пакетный файл запускает программу и задает положение и размер windows?

    Как получить уведомление о изменении статуса сети Wi-Fi?

    jQuery: keyPress Backspace не срабатывает?

    Как программно установить SSLContext клиента JAX-WS?

    Давайте будем гением компьютера.