Map
的retain
和transform
操作涉及键和值,这些概念不是Set
或Buffer
的一部分。
Map是一个可迭代的对象,由键值对(也称为映射或关联)组成。
Map的基本操作类似于Set。
但是你要列出的操作在下面的表格中:
可变Map支持另外总结在以下表格中的操作。
ms transform f
将映射
ms
中所有关联的值使用函数
f
进行转换。
ms retain p
仅保留满足断言
p
的
key
在
ms
中的映射。
一零零一 条评论:
retain
和 transform
本质上是 filter
和 map
的原地变异版本,可以很容易地在 Set
和 Buffer
上定义。
我不明白它们如何与 Map
相关。
我认为
retain
和
transform
提供了特定于映射的实现(因为它们的实现专门处理键和值),用于类似于
map
和
filter
从
TraversableLike
提供的功能。
在
Set
和
Buffer
中实现
transform
将添加很少的价值,因为它只会延迟到
map
。
注意:
Michael Kebe 评论:
还有一件事。 immutable.MapLike
有一个 transform
方法,但没有 retain
方法。
(与 mutable.MapLike
相反,它们都有)
然而,如果 transform 通过过滤和转换现有映射的绑定来生成新映射,那么这似乎符合 转换操作 的性质。
这是 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
}
源代码 for retain
, 但是修改了当前实例,只能兼容可变对象:
def retain(p: (A, B) => Boolean): this.type = {
for ((k, v) <- this ; if !p(k, v))
this -= k
this
}
immutable.MapLike
有transform
方法,但没有retain
方法。 - michael.kebe