Comment convertir une Map<String, String> à la Carte<Long, String> ? (en option : à l'aide de goyave)
J'ai un Map<String, String>
la String
clé est rien, mais la valeur numérique comme "123", etc. Je suis de valeur numérique parce que ces valeurs sont à venir à partir de l'INTERFACE utilisateur dans mon composant JSF. Je ne veux pas modifier le contrat de composant de l'INTERFACE utilisateur.
Maintenant, je voudrais créer un Map<Long, String>
basé sur la ci-dessus Map
, j'ai vu quelques transform
méthodes dans le Maps
classe, mais tous mettent l'accent sur la conversion de la valeur et pas de clé.
Est-il une meilleure façon de convertir Map<String, String>
à Map<Long, String>
?
- Je ne pense pas qu'il y a une fonctionnalité intégrée pour cela. Un bien que je ne vois pas l'utilité pour cela, vous pouvez déposer une demande de fonctionnalité.
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR pour Java 8
Vous pouvez utiliser les flux pour ce faire:
Cela suppose que toutes les touches sont valides à la chaîne des représentations de
Long
s. Aussi, vous pouvez avoir collisions lors de la transformation; par exemple,"0"
et"00"
à la fois la carte de0L
.Je pense que vous auriez à effectuer une itération sur la carte:
Ce code suppose que vous avez épuré de toutes les valeurs dans
map
(donc pas de long non valide valeurs).Je l'espère, il est une meilleure solution.
MODIFIER
je suis tombé sur leScratch, il ne fonctionne que pour les classes qui implémententCollectionUtils#transformedCollection(Collecte, Transformateur)
méthode dans les Communes de Collection-Utils qui ressemble comme il peut en faire ce que vous voulez.Collection
.O(n)
. Je ne peux pas penser de toute façon, vous pourriez le faire tel qu'il est mieux queO(n)
.@Vivin réponse est bonne, mais je pense qu'il est utile d'expliquer pourquoi la Goyave n'ont pas de méthode pour vous permettre de transformer les clés d'une
Map
(ou de transformer uneSet
à tous).Tous de Goyave méthodes de transformation et de filtrage de produire des paresseux résultats... la fonction/le prédicat s'applique uniquement lorsque nécessaire que l'objet est utilisé. Ils ne créent pas de copies. En raison de cela, cependant, une transformation peut facilement se casser les exigences d'un
Set
.Disons, par exemple, vous avez un
Map<String, String>
qui contient à la fois le "1" et "01" comme clés. Ils sont à la fois distinctesString
s, et donc laMap
peut légalement contenir à la fois comme des clés. Si vous les transformer à l'aide deLong.valueOf(String)
, cependant, ils ont tous deux la carte à la valeur1
. Ils ne sont plus distinctes clés. Cela ne va pas casser quoi que ce soit si vous créez une copie de la carte et ajouter les entrées, parce que l'un des doubles de clés remplace la précédente entrée pour cette clé. Un paresseusement transforméMap
, cependant, n'ont aucun moyen de faire respecter les clés uniques, et donc de rompre le contrat d'unMap
.Vous pouvez maintenant utiliser Java 8 flux, de carte, de recueillir à faire de plus en plus lisible, propre manière.
Voici une version mise à jour de l'une des réponses ci-dessous pour faire la Carte inmodifiable (non, ce n'est pas à l'aide de la Goyave, de la simple Java 8):
La réponse courte est non, Goyave ne pas fournir ce un hors de la boîte.
Le chemin le plus simple serait quelque chose comme ci-dessous. Il ya quelques mises en garde, cependant.
Goyave est transformateurs sont tous des "paresseux" ou selon la vue. Je pense que pour mettre en œuvre un plan de transformation clés, vous voulez un deux voies de la fonction. Ma compréhension est qu'il y est un Convertisseur qui est dans les œuvres de la Goyave de l'équipe, ce qui permettrait de résoudre ce problème.
L'autre problème, c'est que vous auriez à faire face à la possibilité de doublons afin d'être "Jimmy-preuve", un autre principe de Goyave. Une façon de gérer qui serait de revenir un Multimap; une autre serait de lancer une exception lorsque vous rencontrez des doublons. Ce que je ne voudrais pas suggérer, c'est de cacher le problème, par exemple en ignorant les entrées suivantes avec des clés en double, ou en les écrasant à la nouvelle entrée avec le double de la clé.
Meilleur poste jamais de fournir des hors-la-plateau des solutions de travail pour que cela se trouve ici:
Transformer HashMap dans Java 8
Ce site affiche toutes les 3 cas possibles: