Файл: Одерски Мартин, Спун Лекс, Веннерс Билл, Соммерс ФрэнкО41 Scala. Профессиональное программирование. 5е изд спб. Питер, 2022. 608 с. ил. Серия Библиотека программиста.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.12.2023
Просмотров: 757
Скачиваний: 11
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
518 Глава 24 • Углубленное изучение коллекций z
z
Операции подразделения groupBy, groupMap, groupMapReduce,
splitAt, span, partition и partitionMap разбивают элементы переданной коллекции на несколько подколлекций.
z z
Операции тестирования элементов exists, forall и count тестируют эле
менты коллекции на соответствие заданному предикату.
z z
Операции свертки foldLeft, foldRight, reduceLeft, reduceRight применя
ют бинарные операции к следующим друг за другом элементам.
z z
Операции специализированных сверток sum, product, min и max рабо
тают с коллекциями конкретных типов (
numeric или comparable
).
z z
Операции со строками mkString и addString предоставляют альтерна
тивные способы преобразования коллекции в строку.
z z
Операция представления view — это коллекция, которая вычисляется лениво. Больше о представлениях вы узнаете из раздела 24.13.
Таблица 24.1. Операции в трейте Iterable
Что
Что делает
Абстрактный метод
xs.iterator
Итератор, который возвращает каждый элемент в xs
Итерирование:
xs.foreach(f)
Применяет функцию f
к каждому элементу xs
Вызов f
нужен только для получения побочных эффектов; по сути, foreach отбрасывает любой результат функции f
xs.grouped(size)
Итератор, который возвращает «блоки» коллек
ции фиксированного размера xs.sliding(size)
Итератор, который возвращает скользящее окно по элементам этой коллекции
Сложение
xs ++ ys
(или xs.concat(ys)
)
Коллекция, состоящая из элементов xs и ys
Элемент ys
— это коллекция
IterableOnce
, то есть
Iterable или
Iterator
Отображения
xs.map(f)
Коллекция, получающаяся в результате примене
ния функции f
к каждому элементу в xs
24 .3 . Трейт Iterable 519
Что
Что делает
xs.flatMap(f)
Коллекция, получающаяся в результате приме
нения функции f
, результатом которой является коллекция, к каждому элементу в xs и объединя
ющая результаты xs.collect(f)
Коллекция, получающаяся в результате примене
ния частично примененной функции f
к каждому элементу в xs
, для которого она определена, и объ
единяющая результаты
Преобразования
xs.toArray
Превращает коллекцию в массив xs.toList
Превращает коллекцию в список xs.toIterable
Превращает коллекцию в итерируемую коллекцию xs.toSeq
Превращает коллекцию в последовательность xs.toIndexedSeq
Превращает коллекцию в проиндексированную последовательность xs.toSet
Превращает коллекцию в множество xs.toMap
Превращает коллекцию пар «ключ — значение» в отображение xs.to(SortedSet)
Обобщенная операция преобразования, которая принимает в качестве параметра фабрику коллекций
Копирование
xs copyToArray(arr,
s,
len)
Копирует максимум len элементов в массиве arr
, начиная с индекса s
. Последние два аргумента необязательны
Получение информации о размере
xs.isEmpty
Проверяет, является ли коллекция пустой xs.nonEmpty
Проверяет, содержит ли коллекция элементы xs.size
Количество элементов в коллекции xs.knownSize
Количество элементов, если его можно вычислить за постоянное время. В противном случае
–1
xs.sizeCompare(ys)
Возвращает отрицательное значение, если коллек
ция xs короче ys
, положительное, если длиннее, и
0
, если обе коллекции имеют одинаковый раз
мер. Работает даже для бесконечных коллекций
520 Глава 24 • Углубленное изучение коллекций
Что
Что делает
xs.sizeIs < 42,
xs.sizeIs != 42
, и т. д.
Сравнивает размер коллекции с заданным значе
нием, перебирая как можно меньше элементов
1 ... 50 51 52 53 54 55 56 57 ... 64
Извлечение элементов
xs.head
Первый элемент коллекции (или какойнибудь элемент, если порядок следования элементов не определен)
xs.headOption
Первый элемент xs в Optionзначении или
None
, если xs пуст xs.last
Последний элемент коллекции (или какойни
будь элемент, если порядок следования элементов не определен)
xs.lastOption
Последний элемент xs в Optionзначении параме
тра или
None
, если xs пуст xs.find(p)
Optionзначение, содержащее первый элемент в xs
, удовлетворяющий условию p
, или
None
, если такого элемента нет
Создание подколлекций
xs.tail
Вся коллекция, за исключением xs.head xs.init
Вся коллекция, за исключением xs.last xs.slice(from, to)
Коллекция, состоящая из элементов в некотором диапазоне индексов xs
(от from включительно до to не включительно)
xs.take(n)
Коллекция, состоящая из первых n
элементов xs
(или n
какихлибо произвольных элементов, если порядок следования элементов не определен)
xs.drop(n)
Вся коллекция xs
, за вычетом тех элементов, ко
торые получаются при использовании выражения xs take n
xs.takeWhile(p)
Самый длинный префикс элементов в коллекции, каждый из которых соответствует условию p
xs.dropWhile(p)
Коллекция без самого длинного префикса элемен
тов, каждый из которых соответствует условию p
xs.takeRight(n)
Коллекция, состоящая из заключительных n
эле
ментов xs
(или произвольных n
элементов, если порядок не определен)
Таблица 24.1 (продолжение)
24 .3 . Трейт Iterable 521
Что
Что делает
xs.dropRight(n)
Вся коллекция, кроме xs takeRight n
xs.filter(p)
Коллекция, состоящая только из тех элементов xs
, которые соответствуют условию p
xs.withFilter(p)
Нестрогий фильтр коллекции. Все операции в отношении фильтруемых элементов будут при
меняться только к тем элементам xs
, для которых условие p
вычисляется в true xs.filterNot(p)
Коллекция, состоящая из тех элементов xs
, кото
рые не соответствуют условию p
Слияния
xs.zip(ys)
Итерируемые пары соответствующих элементов из xs и ys xs.lazyZip(ys)
Значение, предоставляющее методы для поэле
ментной работы с коллекциями xs и ys
. См. раз
дел 14.9
xs.zipAll(ys, x, y)
Итерируемые пары соответствующих элементов из xs и ys
; если одна из последовательностей ко
роче, то расширяется за счет добавления элемен
тов x
или y
xs.zipWithIndex
Итерируемые пары элементов из xs с их индек
сами
Разбиения
xs.splitAt(n)
Разбивает xs по позиции на пару коллекций
(
xs.take(n)
, xs.drop(n)
)
xs.span(p)
Разбивает xs в соответствии с предикатом на пару коллекций (
xs.takeWhile(p)
, xs.dropWhile(p)
)
xs.partition(p)
Разбивает xs на пару коллекций, в одной из которых находятся все элементы, удовлетворя
ющие условию p
, а в другой — все элементы, не удовлетворяющие этому условию (
xs.filter(p)
, xs.filterNot(p)
)
xs.partitionMap(f)
Преобразует каждый элемент xs в значение
Either[X,
Y
] и разбивает результат на две коллек
ции: одна с элементами из
Left
, а другая с элемен
тами из
Right xs.groupBy(f)
Разбивает xs на отображение коллекций в соот
ветствии с функцией дискриминатором f
522 Глава 24 • Углубленное изучение коллекций
Что
Что делает
xs.groupMap(f)(g)
Превращает xs в отображение коллекций в соот
ветствии с функциейдискриминатором f
и при
меняет функцию преобразования g
к каждому элементу каждой коллекции xs.groupMapReduce(f)(g)(h)
Превращает xs в отображение коллекций в со
ответствии с функциейдискриминатором f
, применяет функцию преобразования g
к каждому элементу каждой коллекции и сводит каждую коллекцию к единственному значению, объединяя ее элементы с помощью функции h
Состояния элементов
xs.forall(p)
Булево значение, показывающее, соблюдается ли условие p
для всех элементов xs xs.exists(p)
Булево значение, показывающее, соблюдается ли условие p
для какихлибо элементов xs xs.count(p)
Количество элементов в xs
, удовлетворяющих условию p
Свертки
xs.foldLeft(z)(op)
Применяет бинарную операцию op к последова
тельным элементам xs
, продвигаясь слева на
право, начиная с z
xs.foldRight(z)(op)
Применяет бинарную операцию op к последо
вательным элементам xs
, продвигаясь справа налево, начиная с z
xs.reduceLeft(op)
Применяет бинарную операцию op к последова
тельным элементам xs непустой коллекции xs
, продвигаясь слева направо xs.reduceRight(op)
Применяет бинарную операцию op к последова
тельным элементам xs непустой коллекции xs
, продвигаясь справа налево
Специализованные свертки
xs.sum
Сумма числовых элементов коллекции xs xs.product
Произведение числовых элементов коллекции xs xs.min
Минимальное значение упорядочиваемых эле
ментов коллекции xs xs.max
Максимальное значение упорядочиваемых эле
ментов коллекции xs
Таблица 24.1 (продолжение)
24 .4 . Трейты последовательностей Seq, IndexedSeq и LinearSeq 523
Что
Что делает
Строки
xs addString (b, start, sep, end)
Добавляет строку к строковому буферу b
типа
StringBuilder со всеми элементами xs с разде
лителями sep
, заключенными между строками start и end
. Аргументы start
, sep и end являются необязательными xs mkString (start, sep, end)
Превращает коллекцию в строку со всеми эле
ментами xs с разделителями sep
, заключенными между строками start и end
. Аргументы start
, sep и end являются необязательными
Представления
xs.view
Создает представление xs
Подкатегории Iterable
В иерархии наследования ниже
Iterable находятся три трейта:
Seq
,
Set и
Map
Трейты
Seq и
Map объединяет то, что они реализуют трейт
PartialFunction
1
с методами apply и isDefinedAt
. Но способы реализации
PartialFunction у каждого трейта свои.
Для последовательностей apply
— позиционное индексирование, в котором элементы всегда нумеруются с нуля. То есть
Seq(1,
2,
3)(1)
==
2
. Для мно
жеств apply
— проверка на принадлежность. Например,
Set('a',
'b',
'c')
('b')
==
true
, а
Set()('a')
==
false
. И наконец, для отображений apply
— средство выбора. Например,
Map('a'
–>
1,
'b'
–>
10,
'c'
–>
100)('b')
==
10
Более подробно каждый из этих видов коллекций мы рассмотрим в следу
ющих трех разделах.
24 .4 . Трейты последовательностей Seq,
IndexedSeq и LinearSeq
Трейт
Seq представляет последовательности. Последовательностью назы
вается разновидность итерируемой коллекции, у которой есть длина и все элементы которой имеют фиксированные индексированные позиции, отсчет
1
Частично определенные функции описаны в разделе 13.7.
524 Глава 24 • Углубленное изучение коллекций которых начинается с нуля. Операции с последовательностями (сведены в табл. 24.2) разбиваются на следующие категории.
z z
Операции индексирования и длины apply, isDefinedAt, length, indices
lengthCompare и lengthIs. Для
Seq операция apply означает индексирова
ние, поэтому последовательность типа
Seq[T]
является частично приме
ненной функцией, которая получает аргумент типа
Int
(индекс) и выдает элемент последовательности типа
T
. Иными словами,
Seq[T]
расширяет
PartialFunction[Int,
T]
. Элементы последовательности индексируются от нуля до длины последовательности length за вычетом единицы. Метод length
, применяемый в отношении последовательностей, — псевдоним общего для коллекций метода size
. Метод lengthCompare позволяет срав
нивать длины двух последовательностей, даже если одна из них имеет бесконечную длину. Метод lengthIs
— псевдоним метода sizeIs z
z
Операции поиска индекса indexOf, lastIndexOf, indexOfSlice, lastIn-
dexOfSlice, indexWhere, lastIndexWhere, segmentLength и prefixLength возвращают индекс элемента, равного заданному значению или соответ
ствующего некоему условию.
z z
Операции добавления +: (псевдоним: prepended), ++: (псевдоним: pre-
pen dedAll), :+ (псевдоним: appended), :++ (псевдоним: appendedAll)
и padTo возвращают новые последовательности, получаемые путем до
бавления к началу или концу последовательности.
z z
Операции обновления updated и patch возвращают новую последова
тельность, получаемую путем замены некоторых элементов исходной последовательности.
z z
Операции сортировки sorted, sortWith и sortBy сортируют элементы последовательности в соответствии с различными критериями.
z z
Операции реверсирования reverse и reverseIterator обрабатывают или возвращают элементы последовательности в обратном порядке, с по
следнего до первого.
z z
Операции сравнения startsWith, endsWith, contains, corresponds, con-
tainsSlice и search определяют соотношение двух последовательностей или ищут элемент в последовательности.
z z
Операции над множествами intersect, diff, distinct и distinctBy выпол
няют над элементами двух последовательностей операции, подобные операциям с множествами, или удаляют дубликаты.
Для изменяемой последовательности предлагается дополнительный метод добавления update с побочным эффектом, который позволяет элементам