Вот более общие черты, каждая из которых расширяет предыдущую:
GenTraversableOnce
GenTraversable
GenIterable
GenSeq
Приведенные выше признаки не указывают, является ли сбор последовательным или параллельным.Если ваш код требует, чтобы вещи выполнялись последовательно (как правило, если ваш код имеет побочные эффекты любого рода), они слишком общие для него.
Следующие черты требуют последовательного выполнения:
TraversableOnce
Traversable
Iterable
Seq
LinearSeq
Первый, TraversableOnce
, позволяет вам вызывать только один метод в коллекции.После этого коллекция была «использована».В обмен на это достаточно универсально, чтобы принимать итераторы, а также коллекции.
Traversable
- довольно общая коллекция, которая имеет большинство методов.Однако есть некоторые вещи, которые он не может сделать, и в этом случае вам нужно перейти к Iterable
.
Все Iterable
реализуют метод iterator
, который позволяет вам получить Iterator
для этогоколлекция.Это дает ему возможность для нескольких методов, отсутствующих в Traversable
.
A Seq[A]
реализует функцию Int => A
, что означает, что вы можете получить доступ к любому элементу по его индексу.Это не гарантирует эффективности, но это гарантия того, что каждый элемент имеет индекс, и что вы можете делать предположения о том, каким будет этот индекс.Сравните это с Map
и Set
, где вы не можете сказать, что такое индекс элемента.
A LinearSeq
- это Seq
, обеспечивающий быстрый head
, tail
, isEmpty
и готовьтесь.Это как можно ближе к List
без фактического использования List
явно.
В качестве альтернативы, вы можете иметь IndexedSeq
, который имеет быстрый индексированный доступ (что-то List
не делаетпредоставить).
См. также этот вопрос и этот FAQ на его основе.