Ja som nováčik v Scale a ja hľadám stručnejší spôsob, ako zhrnúť a zoskupiť hodnoty mapy. Existuje lepší spôsob ako nasledujúci kód:
def mapSum(thisMap: Map[Char, Int], thatMap: Map[Char, Int]) = {
thisMap.transform { (k, v) => thatMap(k) + v }
}
Ktorý by spĺňal nasledujúci test:
@Test
def mapSum() {
val map: Map[Char, Int] = Map("C" -> 1, "D" -> 3)
val newMap = mapSum(map, map)
assertEquals(2, newMap("C"))
assertEquals(6, newMap("D"))
}
odpovede:
3 pre odpoveď č. 1Ak ste "ísť na stručné, vy" nebudete sa dostať oveľa lepšie, než je vaša aktuálna verzia so štandardnou knižnicou (aj keď si všimnite, že môžete drop vonkajšie závorky, aby to dva-liner).
Scalaz poskytuje niektoré nástroje, ktoré môžu urobiť tento druh veci trochu stručnejší, vrátane inštancie monoid pre Map
a pasák unionWith
metóda:
scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._
scala> val m = Map("C" -> 1, "D" -> 3)
m: scala.collection.immutable.Map[Char,Int] = Map(C -> 1, D -> 3)
scala> m |+| m
res0: scala.collection.immutable.Map[Char,Int] = Map(C -> 2, D -> 6)
scala> (m unionWith m)(_ + _)
res1: Map[Char,Int] = Map(C -> 2, D -> 6)
Všimnite si, že obidva tieto prístupy sa správajúTrochu inak, ako je vaša, aj keď - v čase behu sa nedajú udusiť, ak sú kľúče v prvom, ktoré nie sú v druhom, a nevedia ticho ignorovať kľúče v druhom, ktoré nie sú v prvej.