Obtenir toutes les Valeurs à partir d'une Carte pour le certaines Touches en Java/Goyave?
Est-il une façon intelligente pour obtenir toutes les Valeurs à partir d'une Carte donné quelques Clés?
Je voudrais une méthode comme ceci:
public static <K, V> Collection<V> getAll(Map<K, V> map, Collection<K> keys)
ou est déjà une goyave?
Voulez-vous vraiment obtenir en retour un ensemble de valeurs plutôt qu'une Carte? Dans le processus de construction, vous perdez l'association entre les clés et les valeurs.
OriginalL'auteur FlorianOver | 2011-04-19
Vous devez vous connecter pour publier un commentaire.
Cela dépend de comment vous voulez que la méthode de travail. Par exemple, des éléments en
keys
qui ne sont pas dansmap
A) être ignorés ou devraient-ils B) être représenté commenull
dans les valeurs renvoyées collection ou faut que C) être une erreur? Également considérer si vous voulez un affichage en direct ou une collecte séparée contenant les valeurs.Pour Un, ma préférence serait:
Cela limite les résultats aux valeurs des clés qui sont réellement dans la carte et devrait être relativement efficace, même si la carte est beaucoup plus grande que l'ensemble de touches que vous voulez. Bien sûr, vous pouvez copier le résultat dans une autre collection en fonction de ce que vous voulez faire avec elle.
Pour B, vous pouvez utiliser @Michael Brewer-Davis solution, sauf avec
Functions.forMap(map, null)
.Pour C, vous feriez tout d'abord vérifier que
map.keySet().containsAll(keys)
et de lever une erreur sifalse
, puis utilisez @Michael Brewer-Davis solution... mais sachez que si vous puis copié le résultat dans une autre collection, la suppression d'une entrée demap
pourrait provoquer uneIllegalArgumentException
de code à l'aide de la collection renvoyée à un certain point.OriginalL'auteur ColinD
Je suis d'accord avec skaffman de réponse, juste pas avec sa conclusion (je pense que c'est mieux que le manuel de l'itération).
Ici, il est écrit:
Aussi, ici, est un non-Goyave version:
filterKeys
pour ce qui sont A) elle nécessite une itération à travers chaque entrée demap
, même sikeys
est beaucoup plus petite (l'inverse semble moins probable pour une méthode de ce genre), et B) si lekeys
collection n'a pas un rapidecontains
mise en œuvre, de l'appeler une fois pour chaque entrée de la carte augmentation de l'ordre de complexité de l'appel. Le code que j'ai donné n'a pas l'une de ces questions. Pour les non-Goyave version, je pense que la boucle serait mieux... votre version nécessite de garder une copie entière de la carte mémoire même si le résultat est vide.OriginalL'auteur Sean Patrick Floyd
Vous pourriez, je suppose que l'utilisation de Goyave est
Maps.filteredKeys()
, en passant dans unPredicate
qui correspond à vos frappes au clavier, mais c'est pas vraiment mieux que le manuel de l'itération.OriginalL'auteur skaffman
À l'aide de goyave:
Collections2.transform(keys, Functions.forMap(map));
IllegalArgumentException
si... la surcharge avec une valeur par défaut peut être préférable si c'est possible.OriginalL'auteur Michael Brewer-Davis
Java8 Flux:
Ou si vous êtes préoccupé par touches manquantes:
Ou si votre carte est thread-safe et la possibilité grand:
OriginalL'auteur Code Eyez