Пакет scala.collection.immutable
пакет immutable
Типовые члены
final служебный класс ::[B](head: B, tl: Список[B]) extends Список[B] with Product with Serializable
абстрактный класс AbstractMap[K, +V] extends collection.AbstractMap[K, V] with Map[K, V]
абстрактный класс BitSet extends AbstractSet[Целое число] with Отсортированный набор[Целое число] with collection.BitSet with BitSetLike[BitSet] with Serializable
Класс для неизменяемых битовых наборов.
Битовые наборы — это множества неотрицательных целых чисел, которые представлены массивами переменной длины бит, упакованными в 64-битные слова. Занимаемая память битового набора определяется наибольшим числом, хранящимся в нем.
- Аннотации
- @SerialVersionUID()
- См. также
Обзор библиотеки коллекций" раздел по
Immutable BitSetsдля получения дополнительной информации.
тракт DefaultMap[A, +B] extends Map[A, B]
Карта по умолчанию, которая реализует методы + и - карт. Это делается с использованием создателя по умолчанию для карт, определенного в объекте Map. Экземпляры, которые наследуются от DefaultMap[A, B], по-прежнему должны определить:
def get(key: A): Option[B] def iterator: Iterator[(A, B)]
Он ссылается обратно на исходную карту.
Также может быть целесообразно переопределить foreach или size, если можно найти эффективные реализации.
- A
тип ключей, содержащихся в этой карте.
- B
тип значений, связанных с ключами.
- С тех пор как
2.8
запечатанный класс HashMap[A, +B] extends AbstractMap[A, B] with Map[A, B] with MapLike[A, B, HashMap[A, B]] with Serializable with CustomParallelizable[(A, B), ParHashMap[A, B]]
Этот класс реализует неизменяемые карты с использованием хэш-дерева.
Примечание: Создатель этого хэш-мапа может возвращать специализированные представления для небольших карт.
- A
тип ключей, содержащихся в этом хэш-мапе.
- B
тип значений, связанных с ключами.
- Аннотации
- @SerialVersionUID()
- С тех пор как
2.3
- См. также
"Обзор библиотеки коллекций Scala" раздел по
Hash Triesдля получения дополнительной информации.
запечатанный класс HashSet[A] extends AbstractSet[A] with Множество[A] with GenericSetTemplate[A, HashSet] with SetLike[A, HashSet[A]] with CustomParallelizable[A, ParHashSet[A]] with Serializable
Этот класс реализует неизменяемые множества с использованием хэш-дерева.
Примечание: Создатель этого хэш-множества может возвращать специализированные представления для небольших множеств.
- A
тип элементов, содержащихся в этом хэш-множестве.
- Аннотации
- @SerialVersionUID()
- С тех пор как
2.3
тракт IndexedSeq[+A] extends Seq[A] with collection.IndexedSeq[A] with GenericTraversableTemplate[A, IndexedSeq] with IndexedSeqLike[A, IndexedSeq[A]]
Подтракт от collection.IndexedSeq, который представляет индексированные последовательности, гарантированные неизменяемыми.
Индексированные последовательности поддерживают доступ к элементам и вычисление длины за константное или почти константное время. Они определяются в терминах абстрактных методов apply для индексирования и length.
Индексированные последовательности не добавляют никаких новых методов к Seq, но обещают эффективные реализации схем произвольного доступа.
sealed abstract класс IntMap[+T] extends AbstractMap[immutable.IntMapUtils.Int, T] with Map[immutable.IntMapUtils.Int, T] with MapLike[immutable.IntMapUtils.Int, T, IntMap[T]]
Специализированная неизменяемая структура карты для целочисленных ключей, основанная на быстрых интегрируемых целочисленных картах Окасаки и Гила. По существу, это дерево, основанное на двоичных разрядах целых чисел.
Примечание: Этот класс с версии 2.8 в значительной степени устарел по сравнению с HashMap.
- T
тип значений, связанных с целочисленными ключами.
- Since
2.7
тракт Iterable[+A] extends Traversable[A] with collection.Iterable[A] with GenericTraversableTemplate[A, Iterable] with IterableLike[A, Iterable[A]] with Parallelizable[A, ParIterable[A]]
Базовый тракт для итерируемых коллекций, гарантированных неизменяемыми.
Это базовый тракт для всех неизменяемых коллекций Scala, которые определяют метод iterator для пошагового перебора элементов коллекции по одному. Реализации этого тракта должны предоставить конкретный метод с сигнатурой:
def iterator: Iterator[A]
Они также должны предоставить метод newBuilder для создания билдера для коллекций того же типа.
Этот тракт реализует метод Iterable foreach метода, проходя по всем элементам с помощью iterator. Подклассы должны переопределить foreach более эффективным способом, если это возможно.
Этот тракт добавляет методы iterator, sameElements, takeRight, dropRight к методам, унаследованным от тракта `Traversable`.
Примечание: Этот тракт заменяет каждый метод, использующий break в TraversableLike, на версию с итератором.
тракт LinearSeq[+A] extends Seq[A] with collection.LinearSeq[A] with GenericTraversableTemplate[A, LinearSeq] with LinearSeqLike[A, LinearSeq[A]]
Подтракт от collection.LinearSeq , который представляет последовательности, гарантированные неизменяемыми.
Линейные последовательности имеют достаточно эффективные методы head, tail, и isEmpty. Если эти методы обеспечивают самый быстрый способ обхода коллекции, коллекция Coll, которая расширяет этот тракт, также должна расширять LinearSeqOptimized[A, Coll[A]].
sealed abstract класс List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A, List] with LinearSeqOptimized[A, List[A]] with Serializable
Класс для неизменяемых связанных списков, представляющих упорядоченные коллекции элементов типа A.
Этот класс поставляется с двумя реализующими case-классами scala.Nil и scala.::, которые реализуют абстрактные члены isEmpty, head и tail.
Этот класс оптимален для паттернов доступа «последним вошел — первым вышел» (LIFO), подобных стеку. Если вам нужен другой паттерн доступа, например, произвольный доступ или FIFO, рассмотрите использование коллекции, более подходящей для этого, чем List.
Примечание: Несмотря на то, что это неизменяемая коллекция, при построении внутри используется изменяемое состояние. Эти изменения состояния незаметны в однопоточном коде, но могут привести к гонкам в некоторых многопоточных сценариях. Состояние нового экземпляра коллекции может не быть «опубликовано» (в смысле спецификации Java Memory Model), поэтому несинхронизированная не-volatile-чтение из другого потока может наблюдать объект в некорректном состоянии (см. scala/bug#7838 для получения подробностей). Обратите внимание, что такое чтение не гарантирует, что оно когда-либо увидит записанный объект, и поэтому не должно использоваться, независимо от этой проблемы. Самый простой способ решения — обмениваться значениями между потоками через переменную volatile.
Производительность
Время: List имеет O(1) операцию добавления в начало и доступ к началу/концу списка. Большинство других операций занимают O(n) по количеству элементов в списке. Это включает в себя индексный поиск элементов, length, append и reverse.
Память: List реализует структурное совместное использование хвостового списка. Это означает, что многие операции имеют нулевую или постоянную стоимость памяти.
val mainList = List(3, 2, 1) val with4 = 4 :: mainList // re-uses mainList, costs one :: instance val with42 = 42 :: mainList // also re-uses mainList, cost one :: instance val shorter = mainList.tail // costs nothing as it uses the same 2::1::Nil instances as mainList
- Аннотации
- @SerialVersionUID()
- С момента
1.0
- Примечание
Функциональный список характеризуется устойчивостью и структурным совместным использованием, что обеспечивает значительные преимущества в плане производительности и потребления памяти в некоторых сценариях при правильном использовании. Однако обратите внимание, что объекты, имеющие несколько ссылок на один и тот же функциональный список (то есть объекты, которые полагаются на структурное совместное использование), будут сериализованы и десериализованы с несколькими списками, по одной на каждую ссылку. Т.е. структурное совместное использование теряется после сериализации/десериализации.
- См. также
Обзор библиотеки коллекций Scala" раздел по
Listsдля получения дополнительной информации.
// Make a list via the companion object factory
val days = List("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
// Make a list element-by-element
val when = "AM" :: "PM" :: List()
// Pattern match
days match {
case firstDay :: otherDays =>
println("The first day of the week is: " + firstDay)
case List() =>
println("There don't seem to be any week days.")
}
sealed class ListMap[A, +B] extends AbstractMap[A, B] with Map[A, B] with MapLike[A, B, ListMap[A, B]] with Serializable
Этот класс реализует неизменяемые карты, используя структуру данных на основе списков. Итераторы и методы обхода карты ListMap посещают пары ключ-значение в порядке их первоначального вставки.
Элементы хранятся во внутренней структуре в обратном порядке вставки, то есть самый новый ключ находится в начале списка. Таким образом, такие методы, как head и tail, имеют сложность O(n), а last и init — O(1). Другие операции, такие как вставка или удаление элементов, также имеют сложность O(n), что делает эту коллекцию подходящей только для небольшого числа элементов.
Экземпляры ListMap представляют пустые карты; их можно создать, либо вызвав конструктор напрямую, либо применив функцию ListMap.empty.
- A
тип ключей, содержащихся в этой карте
- B
тип значений, связанных с ключами
- Аннотации
- @SerialVersionUID()
- С момента
1
sealed class ListSet[A] extends AbstractSet[A] with Set[A] with GenericSetTemplate[A, ListSet] with SetLike[A, ListSet[A]] with Serializable
Этот класс реализует неизменяемые множества, используя структуру данных на основе списков. Итераторы и методы обхода множества ListSet посещают элементы в порядке их первоначальной вставки.
Элементы хранятся во внутренней структуре в обратном порядке вставки, то есть самый новый элемент находится в начале списка. Таким образом, такие методы, как head и tail, имеют сложность O(n), а last и init — O(1). Другие операции, такие как вставка или удаление элементов, также имеют сложность O(n), что делает эту коллекцию подходящей только для небольшого числа элементов.
Экземпляры ListSet представляют пустые множества; их можно создать, либо вызвав конструктор напрямую, либо применив функцию ListSet.empty.
- A
тип элементов, содержащихся в этом множестве
- Аннотации
- @SerialVersionUID()
- С момента
1
sealed abstract class LongMap[+T] extends AbstractMap[immutable.LongMapUtils.Long, T] with Map[immutable.LongMapUtils.Long, T] with MapLike[immutable.LongMapUtils.Long, T, LongMap[T]]
Специализированная структура неизменяемых карт для длинных ключей, основанная на быстрых объединяемых картах длинных чисел Окасаки и Гилла. По сути, это trie, основанное на двоичных цифрах целых чисел.
Примечание: Этот класс с версии 2.8 в значительной степени устарел по сравнению с HashMap.
- T
тип значений, связанных с длинными ключами.
- С момента
2.7
trait Map[K, +V] extends Iterable[(K, V)] with collection.Map[K, V] with MapLike[K, V, Map[K, V]]
Обобщённый трейт для неизменяемых карт. Конкретные классы должны предоставлять функциональность для абстрактных методов в Map:
def get(key: K): Option[V] def iterator: Iterator[(K, V)] def + [V1 >: V](kv: (K, V1)): Map[K, V1] def -(key: K): Map[K, V]
- Since
1
trait MapLike[K, +V, +This <: MapLike[K, V, This] with Map[K, V]] extends collection.MapLike[K, V, This] with Parallelizable[(K, V), ParMap[K, V]]
Обобщённый шаблон для неизменяемых карт от ключей типа K до значений типа V. Для реализации конкретной карты, необходимо предоставить реализации следующих методов (где This — тип фактической реализации карты):
def get(key: K): Option[V] def iterator: Iterator[(K, V)] def + [V1 >: V](kv: (K, V)): Map[K, V1] def - (key: K): This
Если вы хотите, чтобы методы-трансформаторы, такие как take, drop, filter, возвращали тот же тип карты, вы также должны переопределить:
def empty: This
Также рекомендуется переопределить методы foreach и size для повышения эффективности.
- K
тип ключей, содержащихся в этой коллекции.
- V
тип значений, связанных с ключами.
- This
Тип фактической реализации карты.
- Since
2.8
abstract class NumericRange[T] extends AbstractSeq[T] with IndexedSeq[T] with Serializable
NumericRange — более обобщённая версия класса Range, работающая с произвольными типами. Она должна быть снабжена реализацией типа диапазона Integral.
Фабрики для вероятных типов включают Range.BigInt, Range.Long, и Range.BigDecimal. Range.Int существует для полноты, но Int-основанный scala.Range должен быть более производительным.
val r1 = new Range(0, 100, 1) val veryBig = Int.MaxValue.toLong + 1 val r2 = Range.Long(veryBig, veryBig + 100, 1) assert(r1 sameElements r2.map(_ - veryBig))
sealed class Queue[+A] extends AbstractSeq[A] with LinearSeq[A] with GenericTraversableTemplate[A, Queue] with LinearSeqLike[A, Queue[A]] with Serializable
Объекты Queue реализуют структуры данных, позволяющие вставлять и извлекать элементы в порядке очереди (FIFO).
Очередь реализована как пара списков, один содержащий элементы in, а другой — out. Элементы добавляются в список in и удаляются из списка out. Когда список out пустеет, очередь поворачивается путём замены списка out на in.reverse, а in на Nil.
Добавление элементов в очередь всегда имеет стоимость O(1). Удаление элементов имеет стоимость O(1), за исключением случая, когда требуется поворот, в этом случае взимается стоимость O(n), где n — количество элементов в очереди. В этом случае операции удаления с стоимостью O(1) гарантированы. Удаление элемента в среднем занимает O(1).
- Annotations
- @SerialVersionUID()
- Since
1
- See also
обзор Scala's Collection Library раздел о
Immutable Queuesдля получения дополнительной информации.
sealed class Range extends AbstractSeq[Int] with IndexedSeq[Int] with CustomParallelizable[Int, ParRange] with Serializable
Класс Range представляет целые значения в диапазоне [start;end) с ненулевым значением шага step. Это особый случай индексированного последовательности. Например:
val r1 = 0 until 10 val r2 = r1.start until r1.end by r1.step + 1 println(r2.length) // = 5
Диапазоны, содержащие более Int.MaxValue элементов, могут быть созданы, но эти переполненные диапазоны имеют ограниченные возможности. Любой метод, который может потребовать создание коллекции длиной более Int.MaxValue, или может быть запрошен для индексирования за пределами Int.MaxValue элементов, выбросит исключение. Переполненные диапазоны можно безопасно уменьшить, изменив размер шага (например, by 3) или взяв/отбросив элементы. contains, equals, и доступ к концам диапазона (head, last, tail, init) также разрешены для переполненных диапазонов.
- Annotations
- @SerialVersionUID()
- Since
2.5
- See also
обзор Scala's Collection Library раздел о
Rangesдля получения дополнительной информации.
trait Seq[+A] extends Iterable[A] with collection.Seq[A] with GenericTraversableTemplate[A, Seq] with SeqLike[A, Seq[A]] with Parallelizable[A, ParSeq[A]]
Подкласс collection.Seq, представляющий гарантированно неизменяемые последовательности.
Последовательности являются особыми случаями итерируемых коллекций класса Iterable. В отличие от итерируемых коллекций, последовательности всегда имеют определенный порядок элементов. Последовательности предоставляют метод apply для индексирования. Индексы варьируются от 0 до length последовательности. Последовательности поддерживают ряд методов для поиска вхождения элементов или подпоследовательностей, включая segmentLength, prefixLength, indexWhere, indexOf, lastIndexWhere, lastIndexOf, startsWith, endsWith, indexOfSlice.
Еще один способ рассматривать последовательность — как отображение PartialFunction от Int значений к типу элементов последовательности. Метод isDefinedAt последовательности возвращает true для интервала от 0 до length.
К последовательностям можно получить доступ в обратном порядке их элементов, используя методы reverse и reverseIterator.
Последовательности имеют два основных подкласса, IndexedSeq и LinearSeq, которые дают различные гарантии производительности. IndexedSeq обеспечивает быстрый произвольный доступ к элементам и быструю операцию length. LinearSeq обеспечивает быстрый доступ только к первому элементу через head, но также имеет быструю операцию tail.
trait Set[A] extends Iterable[A] with collection.Set[A] with GenericSetTemplate[A, Set] with SetLike[A, Set[A]] with Parallelizable[A, ParSet[A]]
Обобщённый трайт для неизменяемых множеств.
Множество — это коллекция, не содержащая дублирующих элементов.
Для реализации конкретного множества необходимо предоставить реализации следующих методов:
def contains(key: A): Boolean def iterator: Iterator[A] def +(elem: A): This def -(elem: A): This
Если вы хотите, чтобы методы, такие как take, drop, filter возвращали множество того же типа, вы также должны переопределить:
def empty: This
Также рекомендуется переопределить методы foreach и size для повышения эффективности.
- Since
1.0
trait SortedMap[A, +B] extends Map[A, B] with collection.SortedMap[A, B] with MapLike[A, B, SortedMap[A, B]] with SortedMapLike[A, B, SortedMap[A, B]]
Карта, ключи которой отсортированы.
- A
тип ключей, содержащихся в этой сортированной карте.
- B
тип значений, связанных с ключами.
- Since
2.4
trait SortedSet[A] extends Set[A] with collection.SortedSet[A] with SortedSetLike[A, SortedSet[A]]
Подкласс collection.SortedSet, представляющий отсортированные неизменяемые множества.
- Since
2.4
sealed abstract class Stream[+A] extends AbstractSeq[A] with LinearSeq[A] with GenericTraversableTemplate[A, Stream] with LinearSeqOptimized[A, Stream[A]] with Serializable
Класс Stream реализует ленивые списки, где элементы вычисляются только при необходимости. Вот пример:
import scala.math.BigInt
object Main extends App {
lazy val fibs: Stream[BigInt] = BigInt(0) #:: BigInt(1) #:: fibs.zip(fibs.tail).map { n => n._1 + n._2 }
fibs take 5 foreach println
}
// prints
//
// 0
// 1
// 1
// 2
// 3
Класс Stream также использует запоминание результатов (мемоизацию), так что ранее вычисленные значения преобразуются из Stream элементов в конкретные значения типа A. Чтобы проиллюстрировать, мы изменим содержимое значения fibs выше и возьмём ещё несколько значений:
import scala.math.BigInt
object Main extends App {
lazy val fibs: Stream[BigInt] = BigInt(0) #:: BigInt(1) #:: fibs.zip(
fibs.tail).map(n => {
println("Adding %d and %d".format(n._1, n._2))
n._1 + n._2
})
fibs take 5 foreach println
fibs take 6 foreach println
}
// prints
//
// 0
// 1
// Adding 0 and 1
// 1
// Adding 1 and 1
// 2
// Adding 1 and 2
// 3
// And then prints
//
// 0
// 1
// 1
// 2
// 3
// Adding 2 and 3
// 5
В приведённом выше примере есть несколько тонких моментов.
-
Определение
fibs является val а не методом. Для запоминания результатов Stream нам нужно хранилище информации, и val позволяет это сделать. Хотя значение Stream фактически изменяется во время доступа, это не меняет концепции его неизменяемости. После запоминания результатов значения не меняются, и значения, которые ещё не были запомнены, по-прежнему «существуют», просто они ещё не были вычислены. Следует проявлять осторожность при использовании запоминания результатов; вы можете очень быстро израсходовать много памяти, если не будете внимательны. Причина в том, что запоминание результатов для Stream создаёт структуру, похожую на scala.collection.immutable.List. Пока что-то ссылается на голову списка, голова ссылается на хвост, и так далее рекурсивно. Если же ничего не ссылается на голову (например, мы использовали def для определения Stream), то, как только она больше не используется напрямую, она исчезает.Обратите внимание, что некоторые операции, включая drop, dropWhile, flatMap или collect могут обработать большое количество промежуточных элементов перед возвращением. Это неизбежно приводит к удержанию головы, так как они являются методами для Stream, а поток содержит собственную голову. Для вычислений такого рода, где запоминание результатов нежелательно, используйте Iterator, если это возможно.// For example, let's build the natural numbers and do some silly iteration
// over them.
// We'll start with a silly iteration
def loop(s: String, i: Int, iter: Iterator[Int]): Unit = {
// Stop after 200,000
if (i < 200001) {
if (i % 50000 == 0) println(s + i)
loop(s, iter.next, iter)
}
}
// Our first Stream definition will be a val definition
val stream1: Stream[Int] = {
def loop(v: Int): Stream[Int] = v #:: loop(v + 1)
loop(0)
}
// Because stream1 is a val, everything that the iterator produces is held
// by virtue of the fact that the head of the Stream is held in stream1
val it1 = stream1.iterator
loop("Iterator1: ", it1.next, it1)
// We can redefine this Stream such that all we have is the Iterator left
// and allow the Stream to be garbage collected as required. Using a def
// to provide the Stream ensures that no val is holding onto the head as
// is the case with stream1
def stream2: Stream[Int] = {
def loop(v: Int): Stream[Int] = v #:: loop(v + 1)
loop(0)
}
val it2 = stream2.iterator
loop("Iterator2: ", it2.next, it2)
// And, of course, we don't actually need a Stream at all for such a simple
// problem. There's no reason to use a Stream if you don't actually need
// one.
val it3 = new Iterator[Int] {
var i = -1
def hasNext = true
def next(): Int = { i += 1; i }
}
loop("Iterator3: ", it3.next, it3)
-
Интересно, что
tail работает вообще. В определении fibs у нас есть начальное (0, 1, Stream(...)), поэтому tail детерминировано. Если бы мы определили fibs таким образом, что только 0 были бы конкретными, то определение tail потребовало бы вычисления tail, что привело бы к бесконечной рекурсии и переполнению стека. Если мы определим определение, где хвост изначально не вычислим, то у нас будет бесконечная рекурсия:// The first time we try to access the tail we're going to need more
// information which will require us to recurse, which will require us to
// recurse, which...
lazy val sov: Stream[Vector[Int]] = Vector(0) #:: sov.zip(sov.tail).map { n => n._1 ++ n._2 }
Определение fibs выше создаёт больше объектов, чем необходимо, в зависимости от того, как вы хотите его реализовать. Следующая реализация предоставляет более «эффективную» реализацию из-за того, что она имеет более прямой путь к самим числам:
lazy val fib: Stream[Int] = {
def loop(h: Int, n: Int): Stream[Int] = h #:: loop(n, h + n)
loop(1, 1)
}
Обратите внимание, что mkString принудительно вычисляет Stream, но addString нет. В обоих случаях Stream , который содержит или заканчивается циклом (например, lazy val s: Stream[Int] = 0 #:: s ), преобразует дополнительные проходы через цикл в .... Кроме того, addString будет отображать не-запомненный хвост как ?.
- A
тип элементов, содержащихся в этом потоке.
- Since
2.8
- См. также
Обзор библиотеки коллекций Scala раздел о потоках
Streamsдля получения дополнительной информации.
final class StreamIterator[+A] extends AbstractIterator[A] with Iterator[A]
trait StreamView[+A, +Coll] extends StreamViewLike[A, Coll, StreamView[A, Coll]]
trait StreamViewLike[+A, +Coll, +This <: StreamView[A, Coll] with StreamViewLike[A, Coll, This]] extends SeqView[A, Coll] with SeqViewLike[A, Coll, This]
trait StringLike[+Repr] extends IndexedSeqOptimized[Char, Repr] with Ordered[String]
Интерфейс, описывающий строкоподобные коллекции.
- Repr
Тип фактической коллекции, наследующей
StringLike.
- Since
2.8
final class StringOps extends AnyVal with StringLike[String]
Этот класс служит оболочкой, предоставляющей для scala.Predef.String все операции, найденные в индексированных последовательностях. По мере необходимости String неявно преобразуются в экземпляры этого класса.
Разница между этим классом и WrappedString заключается в том, что вызов методов преобразования, таких как filter и map , приведет к объекту String, в то время как WrappedString останется WrappedString.
- Since
2.8
trait Traversable[+A] extends collection.Traversable[A] with GenericTraversableTemplate[A, Traversable] with TraversableLike[A, Traversable[A]] with Immutable
Тракт для итерируемых коллекций, гарантированно неизменяемых.
Это базовый тракт всех типов неизменяемых коллекций Scala. Он реализует поведение, общее для всех коллекций, в терминах метода foreach со следующей сигнатурой:
def foreach[U](f: Elem => U): Unit
Классы коллекций, смешивающие этот тракт, предоставляют конкретный foreach метод, который перебирает все элементы, содержащиеся в коллекции, применяя к каждому заданную функцию. Они также должны предоставить метод newBuilder, который создаёт билдер для коллекций того же типа.
Итерируемый класс может или не может иметь два свойства: строгость и упорядоченность. Ни то, ни другое не представлено как тип.
Экземпляры строгого класса коллекции вычисляют все свои элементы, прежде чем они могут быть использованы как значения. В отличие от этого, экземпляры нестрогого класса коллекции могут отложить вычисление некоторых своих элементов до тех пор, пока экземпляр не станет доступен как значение. Типичным примером нестрогого класса коллекции является scala.collection.immutable.Stream. Более общим классом примеров являются TraversableViews.
Если коллекция является экземпляром упорядоченного класса коллекции, перебирая её элементы с помощью foreach, элементы всегда будут посещаться в том же порядке, даже для разных запусков программы. Если класс не упорядочен, foreach может посещать элементы в разных порядках для разных запусков (но сохранит тот же порядок в одном запуске).
Типичным примером класса коллекции, который не упорядочен, является HashMap объектов. Порядок обхода для хеш-карт будет зависеть от хеш-кодов его элементов, и эти хеш-коды могут отличаться от одного запуска к другому. В отличие от этого, LinkedHashMap упорядочен, потому что его метод foreach посещает элементы в порядке их вставки в HashMap.
final class TreeMap[A, +B] extends SortedMap[A, B] with SortedMapLike[A, B, TreeMap[A, B]] with MapLike[A, B, TreeMap[A, B]] with Serializable
Этот класс реализует неизменяемые карты, используя дерево.
- A
тип ключей, содержащихся в этой карте дерева.
- B
тип значений, связанных с ключами.
- Since
1
- См. также
"Обзор библиотеки коллекций Scala" раздел по
Red-Black Treesдля получения дополнительной информации.
final class TreeSet[A] extends SortedSet[A] with SortedSetLike[A, TreeSet[A]] with Serializable
Этот класс реализует неизменяемые множества, используя дерево.
- A
тип элементов, содержащихся в этом множестве дерева
- Аннотации
- @SerialVersionUID()
- Since
1
- См. также
"Обзор библиотеки коллекций Scala" раздел по
Red-Black Treesдля получения дополнительной информации.
final class Vector[+A] extends AbstractSeq[A] with IndexedSeq[A] with GenericTraversableTemplate[A, Vector] with IndexedSeqLike[A, Vector[A]] with VectorPointer[A] with Serializable with CustomParallelizable[A, ParVector[A]]
Вектор — универсальная неизменяемая структура данных. Обеспечивает произвольный доступ и обновления за время, близкое к постоянному, а также очень быстрые добавление в начало и в конец. Поскольку векторы хорошо сбалансированы между быстрым случайным выбором и быстрыми случайными функциональными обновлениями, они в настоящее время являются стандартной реализацией неизменяемых индексированных последовательностей. Он основан на little-endian bit-mapped vector trie с коэффициентом ветвления 32. Локальность очень высокая, но не непрерывная, что хорошо подходит для очень больших последовательностей.
Примечание: Несмотря на то, что это неизменяемая коллекция, в реализации используется изменчивое состояние во время построения. Эти изменения состояния незаметны в однопоточном коде, но могут привести к гонкам в некоторых многопоточных сценариях. Состояние нового экземпляра коллекции может не быть «опубликовано» (в смысле спецификации модели памяти Java), поэтому несинхронизированное неявное чтение из другого потока может увидеть объект в некорректном состоянии (см. scala/bug#7838 для получения дополнительных сведений). Обратите внимание, что такое чтение не гарантируется, что оно когда-либо увидит написанный объект вообще, и поэтому не должно использоваться, независимо от этой проблемы. Самый простой способ обойти это — обмениваться значениями между потоками через volatile переменную.
- A
тип элемента
- Аннотации
- @SerialVersionUID()
- См. также
"Обзор библиотеки коллекций Scala" раздел по
Vectorsдля получения дополнительной информации.
final class VectorBuilder[A] extends ReusableBuilder[A, Vector[A]] with VectorPointer[A]
Класс для построения экземпляров Vector. Этот билдер многоразового использования.
class VectorIterator[+A] extends AbstractIterator[A] with Iterator[A] with VectorPointer[A]
final class WrappedString extends AbstractSeq[Char] with IndexedSeq[Char] with StringLike[WrappedString]
Этот класс служит оболочкой, расширяющей Strings всеми операциями, которые можно найти в индексированных последовательностях.
Разница между этим классом и StringOps заключается в том, что вызов методов преобразования, таких как filter и map, приведет к объекту типа WrappedString вместо String.
- Since
2.8
trait MapProxy[A, +B] extends Map[A, B] with MapProxyLike[A, B, Map[A, B]]
Это простой класс-оболочка для `scala.collection.immutable.Map`.
Он наиболее полезен для динамического сборки настраиваемых абстракций карт с помощью композиции объектов и переадресации.
- Annotations
- @deprecated
- Устарело
(С версии 2.11.0) проксирование устарело из-за отсутствия использования и поддержки на уровне компилятора
- Since
2.8
class PagedSeq[T] extends AbstractSeq[T] with collection.IndexedSeq[T]
Реализация ленивых вычисляемых последовательностей, где элементы хранятся в "страницах", т.е. массивах фиксированного размера.
Последовательность страниц создается с помощью функции, которая производит больше элементов по запросу. Функция производителя - more, похожа на метод чтения в java.io.Reader. Функция more принимает три параметра: массив элементов, начальный индекс и конечный индекс. Она должна попытаться заполнить массив между начальным и конечным индексами (исключая конечный индекс). Она возвращает количество произведенных элементов или -1, если конечная логическая входная последовательность была достигнута до чтения любого элемента.
- T
тип элементов, содержащихся в этой последовательности страниц, с контекстным ограничением
ClassTag.
- Annotations
- @deprecated
- Устарело
(С версии 2.11.8) этот класс будет перемещен в модуль scala-parser-combinators
- Since
2.7
trait SetProxy[A] extends Set[A] with SetProxyLike[A, Set[A]]
Это простой класс-оболочка для scala.collection.immutable.Set.
Он наиболее полезен для динамического сборки настраиваемых абстракций множеств с использованием композиции объектов и переадресации.
- A
тип элементов, содержащихся в этом прокси-множестве.
- Annotations
- @deprecated
- Устарело
(С версии 2.11.0) проксирование устарело из-за отсутствия использования и поддержки на уровне компилятора.
- Since
2.8
class Stack[+A] extends AbstractSeq[A] with LinearSeq[A] with GenericTraversableTemplate[A, Stack] with LinearSeqOptimized[A, Stack[A]] with Serializable
Этот класс реализует неизменяемые стеки с использованием структуры данных на основе списка.
Примечание: Этот класс существует только по историческим причинам и в качестве аналога изменяемых стеков. Вместо неизменяемого стека можно просто использовать список.
- A
тип элементов, содержащихся в этом стеке.
- Annotations
- @SerialVersionUID() @deprecated
- Устарело
(С версии 2.11.0) Stack - это неэффективная и, возможно, плохо выполняющаяся оболочка вокруг List. Используйте List вместо этого: stack push x становится x :: list; stack.pop - это list.tail.
- Since
1
- См. также
"Обзор библиотеки коллекций Scala" раздел по
Immutable stacksдля получения дополнительной информации.
Члены-значения
объект BitSet extends BitSetFactory[BitSet] with Serializable
объект HashMap extends ImmutableMapFactory[HashMap] with generic.BitOperations.Int with Serializable
объект HashSet extends ImmutableSetFactory[HashSet] with Serializable
объект IndexedSeq extends IndexedSeqFactory[IndexedSeq]
Этот объект предоставляет набор операций для создания значений . Текущая реализация по умолчанию IndexedSeqIndexedSeq — это Vector.
объект IntMap
объект Iterable extends GenTraversableFactory[Iterable] with TraversableFactory[Iterable]
Этот объект предоставляет набор операций для создания значений . Текущая реализация по умолчанию immutable.Iterableimmutable.Iterable — это List.
объект LinearSeq extends SeqFactory[LinearSeq]
Этот объект предоставляет набор операций для создания значений . Текущая реализация по умолчанию immutable.LinearSeqimmutable.LinearSeq — это List.
объект List extends SeqFactory[List] with Serializable
объект ListMap extends ImmutableMapFactory[ListMap] with Serializable
Этот объект предоставляет набор операций, необходимых для создания значений ListMap.
Обратите внимание, что добавление каждого элемента занимает время O(n), что означает, что создание карты списка с n элементами займёт время O(n2). Это делает этот билдер подходящим только для небольшого числа элементов.
- Since
1
- См. также
"Обзор библиотеки коллекций Scala" раздел о
List Mapsдля получения дополнительной информации.
объект ListSet extends ImmutableSetFactory[ListSet] with Serializable
Этот объект предоставляет набор операций, необходимых для создания значений ListSet.
Обратите внимание, что добавление каждого элемента занимает время O(n), что означает, что создание множества списка с n элементами займёт время O(n2). Это делает этот билдер подходящим только для небольшого числа элементов.
- Since
1
объект LongMap
объект Map extends ImmutableMapFactory[Map]
объект Nil extends List[Nothing] with Product with Serializable
Пустой список.
- Аннотации
- @SerialVersionUID()
- Since
2.8
объект NumericRange extends Serializable
объект Queue extends SeqFactory[Queue] with Serializable
объект Range extends Serializable
объект Seq extends SeqFactory[Seq]
объект Set extends ImmutableSetFactory[Set]
объект SortedMap extends ImmutableSortedMapFactory[SortedMap]
объект SortedSet extends ImmutableSortedSetFactory[SortedSet]
объект Stack extends SeqFactory[Stack] with Serializable
объект Stream extends SeqFactory[Stream] with Serializable
Объект Stream предоставляет вспомогательные функции для работы со стримами.
- Since
2.8
объект StringLike
Объект-компаньон для StringLike содержащий некоторые константы.
- Since
2.8
объект Traversable extends GenTraversableFactory[Traversable] with TraversableFactory[Traversable]
Этот объект предоставляет набор операций для создания значений . Текущая реализация immutable.Traversableimmutable.Traversable — это List.
объект TreeMap extends ImmutableSortedMapFactory[TreeMap] with Serializable
объект TreeSet extends ImmutableSortedSetFactory[TreeSet] with Serializable
объект Vector extends IndexedSeqFactory[Vector] with Serializable
объект WrappedString
Объект-компаньон для обернутых строк.
- Since
2.8
© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.12.9/scala/collection/immutable/index.html
Непустой список, характеризуемый головой и хвостом.
тип элементов списка.
первый элемент списка
список, содержащий оставшиеся элементы этого списка после первого.
2.8