Java 8 extrait la première clé de la valeur correspondante dans une carte
Supposons que j'ai une carte de nom, prénom paires et je veux trouver le nom de la première entrée de la carte avec le nom de famille correspondant à une certaine valeur.
Comment pourrions-nous le faire en java 8 de la mode.
Dans mon cas de test exemple ci-dessous j'ai mis deux façons de le faire.
Cependant la première (à la recherche pour le nom de la première personne avec un nom de famille de "l'Âne") va lancer java.util.NoSuchElementException: Aucune valeur présente de sorte qu'il n'est pas sûr.
Le second fonctionne, mais il n'est pas seulement plus difficile à lire mais c'est un peu pas très fonctionnelle.
Demandais si quelqu'un ici serait de me suggérer une plus facile plus claire de la façon d'atteindre ce but en utilisant soit stream()
ou forEach()
ou les deux.
@Test
public void shouldBeAbleToReturnTheKeyOfTheFirstMatchingValue() throws Exception {
Map<String, String> names = new LinkedHashMap<>();
names.put("John", "Doe");
names.put("Fred", "Flintstone");
names.put("Jane", "Doe");
String keyOfTheFirst = names.entrySet().stream().filter(e -> e.getValue().equals("Doe")).findFirst().get().getKey();
assertEquals("John", keyOfTheFirst);
try {
names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst().get();
} catch (NoSuchElementException e){
//Expected
}
Optional<Map.Entry<String, String>> optionalEntry = names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst();
keyOfTheFirst = optionalEntry.isPresent() ? optionalEntry.get().getKey() : null;
assertNull(keyOfTheFirst);
}
Vous en remercie d'avance.
source d'informationauteur Julian
Vous devez vous connecter pour publier un commentaire.
Pour retourner une valeur par défaut si aucune correspondance n'est trouvée, utilisez
Option#orElse
De la solution fournie par @Misha est le meilleur si vous ne souhaitez pas utiliser le code tiers. Ma bibliothèque , c'est le raccourci de la méthode
ofKeys
pour de tels cas que j'ai découvert que c'est très commun de la tâche:D'un semblable question:
Ensuite, vous pouvez sélectionner la première, si vous le souhaitez. Rappelez-vous que le
key
est unique, levalue
ne l'est pas.Edit:
L'ensemble du code (merci @Pierre Lawrey)
J'aime à l'ancienne: