perché i metodi transform
(sul posto versione mutazione del map
) e retain
(sul posto versione mutazione del filter
) sono definiti solo su mutable.Map
ma non su mutable.Buffer
e mutable.Set
? shouldnt tutte le collezioni mutabili supportano questi metodi?inconsistenza di scala 2.8 collezioni?
risposta
Le operazioni retain
e transform
di Map
sono sulle chiavi e valori, concetti che non fanno parte di un Set
o un Buffer
.
Una mappa è un Iterable costituito da coppie di chiavi e valori (denominati anche associazioni o associazioni).
Le operazioni fondamentali sulle mappe sono simili a quelle sui set.
Ma le operazioni sono elencati in:
mappe Mutevole sostenere oltre le operazioni riassunte nella tabella seguente.
ms transform f
Converte tutti i valori associati nella cartina
ms
con funzionef
.
ms retain p
Mantiene solo quelle mappature in
ms
che hanno unkey
soddisfacente predicatop
.
one-zero-zero-one commenti:
retain
etransform
sono essenzialmente in-place versioni mutazione difilter
emap
rispettivamente, e possono essere facilmente definiti inSet
eBuffer
.
Non vedo come sonoMap
-specific.
Direi che retain
e transform
offerta conforme alla Mappa implementazioni (in quanto la loro applicazione si occupa specificamente di chiavi e valori) per le caratteristiche come quelli forniti da map
e filter
da TraversableLike
.
L'implementazione di transform
in Set
e Buffer
aggiungerebbe poco valore dato che sarebbe semplicemente differito a map
.
Nota: Michael Kebe commenti:
più una cosa.
immutable.MapLike
ha il metodotransform
, ma non il metodoretain
.
(al contrario di mutable.MapLike
che ha sia)
Questo sembra tuttavia in linea con la natura delle transformation operations se trasformare produce una nuova mappa filtrando e trasformando legature di una mappa esistente.
Ecco la 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
, tuttavia, ha modificato l'istanza corrente, che può essere compatibile solo con oggetti mutabili:
/** 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
}
-1, 'retain' e' transform' sono essenzialmente versioni di mutazione sul posto di 'filter' e' map' rispettivamente e possono essere facilmente definiti su 'Set' e' Buffer'. Non vedo come siano specifici di 'Map'. –
@one: il modo in cui sono documentati implica nozioni specifiche della mappa. Ma hai ragione, potrebbero essere estesi a Set e Buffer. Tuttavia, poiché 'filter' e' map' sono già presenti, potrebbe essere necessario meno per 'Set' e' Buffer'. – VonC
@ one-zero-zero-one: ho aggiornato la mia risposta per riflettere sul tuo commento. – VonC
più una cosa. 'immutable.MapLike' ha il metodo' transform', ma non il metodo 'retain'. –
@michael: Ho aggiornato la mia risposta per tenere conto di questa differenza. – VonC