为什么方法transform
(就地突变版本map
)和retain
(就地突变版本filter
)仅定义在mutable.Map
而不是定义在mutable.Buffer
和上mutable.Set
?不应该所有可变集合都支持这些方法吗?
1 回答
retain
和transform
of的操作Map
是关于键和值的,它们不是 aSet
或 a 的一部分Buffer
。
Map 是由键和值对(也称为映射或关联)组成的 Iterable。
地图上的基本操作与集合上的类似。
但是您的操作列在:
可变映射还支持下表中总结的操作。
ms transform f
ms
使用 function转换 map 中的所有关联值f
。
ms retain p
仅保留那些
ms
具有key
令人满意的映射的 predicatep
。
一零零一评论:
retain
和本质上分别是和transform
的就地突变版本,可以很容易地在和上定义。 我看不出它们是如何特定的。filter
map
Set
Buffer
Map
我会争辩说,retain
并transform
提供特定于 Map 的实现(因为它们的实现专门处理键和值),用于诸如由map
和filter
from提供的特性TraversableLike
。
实施transform
inSet
并Buffer
不会增加任何价值,因为它只会推迟到map
.
注:Michael Kebe评论:
还有一件事。
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
修改了当前实例,该实例只能与 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
}