J'essaye de convertir l'ancien conventionnel pour chaque boucle jusqu'à Java7 en Java8 pour chaque boucle d'un ensemble d'entrées de carte, mais je reçois une erreur. Voici le code que j'essaye de convertir:
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}
Voici les changements que j'ai faits:
map.forEach( Map.Entry<String, String> entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
J'ai essayé de faire ça aussi:
Map.Entry<String, String> entry;
map.forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Mais toujours face à une erreur. L'erreur que j'obtiens est la suivante: la signature de l'expression Lambda ne correspond pas à la signature de la méthode d'interface fonctionnelle accept(String, String)
Lire le javadoc : Map<K, V>.forEach()
attend un BiConsumer<? super K,? super V>
en tant qu'argument, et la signature de la méthode abstraite BiConsumer<T, U>
est accept(T t, U u)
.
Donc, vous devriez lui passer une expression lambda qui prend deux entrées en argument: la clé et la valeur:
map.forEach((key, value) -> {
System.out.println("Key : " + key + " Value : " + value);
});
Votre code fonctionnerait si vous appeliez forEach () sur l'ensemble des entrées de la carte, et non sur la carte elle-même:
map.entrySet().forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Peut-être que la meilleure façon de répondre aux questions telles que "quelle version est la plus rapide et laquelle devrais-je utiliser?" est de regarder le code source:
map.forEach () - à partir de Map.Java
default void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action);
for (Map.Entry<K, V> entry : entrySet()) {
K k;
V v;
try {
k = entry.getKey();
v = entry.getValue();
} catch(IllegalStateException ise) {
// this usually means the entry is no longer in the map.
throw new ConcurrentModificationException(ise);
}
action.accept(k, v);
}
}
map.entrySet (). forEach () - à partir d'Iterable.Java
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
Cela révèle immédiatement que map.forEach () utilise également Map.Entry en interne. Donc, je ne m'attendrais à aucun avantage de performance en utilisant map.forEach () sur le map.entrySet (). forEach () . Donc, dans votre cas, la réponse dépend vraiment de vos goûts personnels :)
Pour obtenir la liste complète des différences, veuillez vous reporter aux liens javadoc fournis. Bon codage!
Vous pouvez utiliser le code suivant pour votre besoin
map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
public void iterateStreamAPI(Map<String, Integer> map) {
map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":"e.getValue()));
}
HashMap<String,Integer> hm = new HashMap();
hm.put("A",1);
hm.put("B",2);
hm.put("C",3);
hm.put("D",4);
hm.forEach((key,value)->{
System.out.println("Key: "+key + " value: "+value);
});