Map 的操作retain 和transform 是关于键和值,这些概念不属于Set 或@987654323 @。
Map 是由键和值对(也称为映射或关联)组成的 Iterable。
地图上的基本操作与集合上的类似。
但你的操作列在:
可变映射支持另外下表中总结的操作。
ms transform f
使用函数f 转换映射ms 中的所有关联值。
ms retain p
仅保留ms 中具有key 满足谓词p 的那些映射。
one-zero-zero-onecmets:
retain 和transform 基本上分别是filter 和map 的就地突变版本,可以在Set 和Buffer 上轻松定义。
我不明白他们是如何Map-specific。
我认为 retain 和 transform 提供特定于 Map 的实现(因为它们的实现专门处理键和值),用于类似于 @ 的 map 和 filter 提供的特性987654327@.
在Set 和Buffer 中实现transform 不会增加任何价值,因为它只会推迟到map。
注意:Michael Kebecmets:
还有一件事。 immutable.MapLike 有方法transform,但没有方法retain。
(相对于mutable.MapLike 两者兼有)
然而,如果 transform 通过过滤和转换现有地图的绑定来生成新地图,这似乎符合transformation operations 的性质。
这里是source code for 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
}
Source code for retain,但是修改了当前实例,只能兼容Mutable对象:
/** 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
}