Відповіді:
З точки зору Java, Scala Seq
буде Java List
, а Scala - List
Java LinkedList
.
Зауважте, що Seq
це а trait
, що еквівалентно Java interface
, але з еквівалентом сучасних методів захисту. Scala's List
- це абстрактний клас, який поширюється на, Nil
і ::
які є конкретними реалізаціями List
.
Отже, там, де Java List
є interface
, Scala List
- це реалізація.
Крім того, Скала List
незмінна, що не стосується LinkedList
. Насправді, Java не має еквівалента незмінних колекцій (лише те, що читає, гарантує лише те, що новий об’єкт неможливо змінити, але ви все одно можете змінити старий, а отже, і "лише для читання").
Скала 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 є багато підкласів, включаючи чергу, діапазон, список, стек та 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 список успадковується від Seq, але реалізує продукт ; ось правильне визначення Списку :
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[Примітка: фактичне визначення . Це трохи трохи складніше, для того , щоб вписатися в і використовувати дуже потужні рамки колекції в Scala]
Як сказав @ daniel-c-sobral, List розширює ознаку Seq і є абстрактним класом, реалізованим scala.collection.immutable.$colon$colon
(або ::
коротко), але технічні характеристики, окрім того, що більшість списків і послідовностей, які ми використовуємо, ініціалізуються у вигляді 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-програмістам.