Scalas MapLike
Merkmal hat eine Methode
mapValues [C] (f: (B) ⇒ C): Map[A, C]
Aber ich möchte manchmal einen anderen Typ:
mapKeysAndValues [C] (f: (A, B) ⇒ C): Map[A, C]
Gibt es eine einfache Möglichkeit, die mir fehlt? Dies kann natürlich mit einer Falte erfolgen.
f : (A,B) => (A,C)
, können Sie einfachm.map(f.tupled)
. Funktioniert mit,val f = (x: String, y: Int) => (x, y+1)
aber seltsamerweise beschwert sich die Antwort, wenn ichf
gleichwertig mit definieredef
.case
hier?{case (key, value) => ...}
ist in diesem Fall nur ein Mustervergleich. Anstatt a eine Funktion zu gebenmap
, gebe ich ihr eine Teilfunktion.case
Sie können Typen in das Muster einfügen, dies ist jedoch nicht sicher, da dies zu einem Laufzeitfehler führen kann (da es sich nur um eine Musterübereinstimmung handelt). Wenn Sie in der Zwischenzeit die Struktur der Sammlung unter dermap
Funktion so ändern , dass zu wenige oder zu viele Objekte zum Interpretieren vorhanden sind(key, value)
, wird erneut ein Laufzeitfehler erwartet. :(Was ist mit diesem Code:
Welches produziert:
Dies kann in die Dienstprogrammmethode gepackt werden:
Verwendung:
quelle
MapLike#transform
?quelle
Mit etwas Scalaz:
Ich mag die Lösung von @ tenshi besser.
quelle
Sie können eine Dienstprogrammklasse erstellen:
Code nicht getestet, aber es sollte irgendwie ähnlich funktionieren.
quelle