Filtre de la Carte par un jeu de clés
Est-il un raccourci pour filtrer une Carte de conserver uniquement les entrées où la clé est contenue dans un Ensemble donné?
Voici un exemple de code
scala> val map = Map("1"->1, "2"->2, "3"->3)
map: scala.collection.immutable.Map[java.lang.String,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3)
scala> map.filterKeys(Set("1","2").contains)
res0: scala.collection.immutable.Map[java.lang.String,Int] = Map(1 -> 1, 2 -> 2)
Je suis à la recherche de quelque chose de plus court que cela.
- Quelque chose de plus court que
map.filterKeys(Set("1","2").contains)
? Ne pensez-vous pas que c'est court et assez clair? - C'est assez clair, mais je suis à la recherche de quelque chose de plus court.
- Et il peut être en effet! Voir ma réponse
- Toujours à la recherche de quelque chose de plus clair et plus compréhensible pour plus tard, quand vous l'écrémage de votre code
Vous devez vous connecter pour publier un commentaire.
De répondre à la Question
Vous pouvez profiter du fait qu'un
Set[A]
est un prédicat; c'est à direA => Boolean
Ici, il est à l'œuvre:
Ou si vous préférez:
Prédicats
Il fait vraiment utile d'avoir quelques wrapper autour d'un prédicat. Comme:
Et une conversion implicite:
Et puis vous pouvez l'utiliser:
Cela peut être étendu à
xor
,nand
etc etc et si vous incluez symbolique unicode peut faire pour étonnamment lisible le code:filterKeys
résultat encapsule la carte originale, sans copier les éléments. Cela peut être un problème pour les grandes structures, où vous attendent les éléments supprimés pour être nettoyée plus tard.Un tangentielle pointe, dans le cas où vous allez suivre le
PredicateW
idée de @oxbow_lakes' réponse:En programmation fonctionnelle, au lieu de définir les fonctions ad hoc, nous visons le plus généralisée et composable abstractions. Pour ce cas particulier,
Applicative
correspond à la facture.Set
eux-mêmes sont des fonctions, et laApplicative
exemple pour[B]Function1[A, B]
nous permet de soulever des fonctions de cadre. En d'autres termes, vous pouvez soulever des fonctions de type(Boolean, Boolean) => Boolean
(comme||
,&&
etc.) pour(A => Boolean, A => Boolean) => (A => Boolean)
. (Ici vous pouvez trouver une grande explication sur cette notion de levage.)Cependant la structure de données
Set
lui-même a uneApplicative
instance disponible, qui sera favorisée par rapport à[B]Applicative[A => B]
instance. Pour éviter cela, nous devrons indiquer explicitement au compilateur de traiter l'ensemble comme une fonction. Nous définissons un enrichissement pour que:Et maintenant, mettez cette
Applicative
de bonté dans l'utilisation.Remarque: Tous les ci-dessus nécessite Scalaz.
Désolé, pas une réponse directe à votre question, mais si vous savez que les touches sur lesquelles vous souhaitez supprimer (à la place de ceux que vous souhaitez conserver), vous pourriez faire ceci:
map -- (map.keySet &~ Set("1","2"))
vous pouvez toujours calculer les clés à supprimer, étant donné que vous connaissez des touches à garder. (&~
est "différence", qui, je l'espère optimisé sur--
)