为什么方法transform
(map
的就地变异版本)和retain
(filter
的就地变异版本)仅在{{1}上定义但不在mutable.Map
和mutable.Buffer
上?所有可变集合都不支持这些方法吗?
答案 0 :(得分:8)
Map
的操作retain
和transform
关于键和值,这些概念不属于{ {3}}或Set
。
Map是一个Iterable,由成对的键和值组成(也称为映射或关联) 地图上的基本操作类似于集合上的基本操作。
但您的操作列在:
可变地图支持 以及 下表中汇总的操作。
ms transform f
使用函数
ms
转换地图f
中的所有关联值。
ms retain p
仅保留
ms
中具有key
令人满意的谓词p
的映射。
Buffer
评论:
retain
和transform
基本上分别是filter
和map
的就地变种版本,可以在Set
和{{1}上轻松定义}。
我不知道它们是如何Buffer
- 具体的。
我认为Map
和retain
为one-zero-zero-one和{{}提供的功能提供特定于地图的实现(因为它们的实现专门处理键和值) 3}}来自 map
。
在transform
和transform
中实施Set
会增加一些价值,因为它只会对Buffer
产生影响。
注意:filter
评论:
还有一件事。
TraversableLike
使用方法map
,但不使用方法transform
。
(与Michael Kebe同时存在)
如果转换通过过滤和转换现有地图的绑定来生成新地图,这似乎与immutable.MapLike
的性质一致。
retain
然而,transformation operations修改了当前实例,该实例只能与Mutable对象兼容:
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
}