Ответ 1
В терминах Java Scala Seq
будет Java List
, а Scala List
будет Java LinkedList
.
Обратите внимание, что Seq
- это trait
, что эквивалентно Java interface
, но с эквивалентом методов защиты вверх и вниз. Scala List
- абстрактный класс, который расширяется Nil
и ::
, которые являются конкретными реализациями List
.
Итак, где Java List
является interface
, Scala List
является реализацией.
Кроме того, Scala List
является неизменным, что не относится к LinkedList
. Фактически, Java не имеет эквивалента неизменяемым коллекциям (только для чтения только гарантирует, что новый объект не может быть изменен, но вы все равно можете изменить старый и, следовательно, "только для чтения" ).
Scala List
сильно оптимизирован компилятором и библиотеками, а это фундаментальный тип данных в функциональном программировании. Однако он имеет ограничения и неадекватен для параллельного программирования. В наши дни Vector
- лучший выбор, чем List
, но привычка трудно сломать.
Seq
- хорошее обобщение для последовательностей, поэтому, если вы программируете на интерфейсы, вы должны использовать это. Обратите внимание, что на самом деле их три: collection.Seq
, collection.mutable.Seq
и collection.immutable.Seq
, а последний - это "по умолчанию", импортированный в область видимости.
Там также GenSeq
и ParSeq
. Последние методы выполняются параллельно, где это возможно, причем первое является родительским для Seq
и ParSeq
обоих, являясь подходящим обобщением, когда parallelism кода не имеет значения. Они оба относительно недавно введены, поэтому люди пока не используют их много.