Операции retain
и transform
из Map
означают о ключах и значениях , понятия, которые не являются частью Set
или Buffer
.
Карта - это Iterable, состоящий из пар ключей и значений (также называемых отображениями или ассоциациями).
Основные операции на картах аналогичны операциям на наборах.
Но ваши операции перечислены в:
Поддержка изменяемых карт в дополнение Операции сведены в следующую таблицу.
ms transform f
Преобразует все связанные значения в карте ms
с помощью функции f
.
ms retain p
Сохраняет только те отображения в ms
, которые имеют key
удовлетворяющий предикат p
.
один-ноль-ноль-один комментарии:
retain
и transform
по существу являются версиями мутаций на местеfilter
и map
соответственно и могут быть легко определены для Set
и Buffer
.
Я не вижу, как они * Map
-специфичны.
Iбудет утверждать, что retain
и transform
предлагают специфичные для карты реализации (в том смысле, что их реализация специально работает с ключами и значениями) для функций, подобных тем, которые предоставляются map
и filter
из TraversableLike
.
Реализация transform
в Set
и Buffer
добавит небольшое значение, так как будет просто зависеть от map
.
Примечание: Майкл Кебе комментарии:
Еще одна вещь.immutable.MapLike
имеет метод transform
, но не метод retain
.
(в отличие от mutable.MapLike
, который имеет оба)
Однако это похоже на природу операций преобразования , если transform создает новую карту путем фильтрации и преобразования привязок существующей карты.
Вот исходный код для преобразования
def transform[C, That](f: (A, B) => C)(implicit bf: CanBuildFrom[This, (A, C), That]): That = {
val b = bf(repr)
for ((key, value) <- this) b += ((key, f(key, value)))
b.result
}
Исходный код для retain
, однако изменил текущий экземпляр, что можетбыть совместимым только с изменяемыми объектами:
/** Retains only those mappings for which the predicate
* `p` returns `true`.
*
* @param p The test predicate
*/
def retain(p: (A, B) => Boolean): this.type = {
for ((k, v) <- this ; if !p(k, v))
this -= k
this
}