メソッドtransform
(インプレースミューテーションバージョンのmap
)とretain
(インプレースミューテーションバージョンのfilter
)がのみで定義されているのに、では定義されていmutable.Map
ないのはなぜですか?すべての可変コレクションがこれらのメソッドをサポートするべきではありませんか?mutable.Buffer
mutable.Set
1 に答える
操作retain
およびtransform
は、 キーと値Map
に関するものであり、または の一部ではない概念です。Set
Buffer
Map は、キーと値のペア (マッピングまたは関連付けとも呼ばれます) で構成される Iterable です。
マップでの基本的な操作は、セットでの操作と似ています。
ただし、操作は次の場所にリストされています。
可変マップは、次の表に要約されている操作に加えてサポートします。
ms transform f
map 内の関連するすべての値
ms
を functionで変換しますf
。
ms retain p
ms
predicateをkey
満たすマッピングのみを保持しp
ます。
ゼロゼロワンのコメント:
retain
とtransform
は本質的に と のインプレース ミューテーション バージョンでfilter
あり、 とでmap
簡単に定義できます。 それらがどのように特定されているのかわかりません。Set
Buffer
Map
私はそれを主張しretain
、transform
Map 固有の実装 (それらの実装はキーと値を具体的に扱うという点で) によって提供される機能map
やfilter
から提供されるもののような機能を提供しTraversableLike
ます。
と を実装transform
しても、単に を無視するだけなので、ほとんど価値がありませSet
ん。Buffer
map
注:マイケル・ケベのコメント:
もう一つ。
immutable.MapLike
には methodtransform
がありますが、 method はありません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
}