forEach loop Java 8 pour le jeu d'entrées de carte
J'essaie de convertir l'ancien conventionnel pour chaque boucle jusqu'à java7 en java8 pour chaque boucle pour un ensemble d'entrées de carte mais j'obtiens une erreur. Voici le code que j'essaie 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 le faire aussi:
Map.Entry<String, String> entry;
map.forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Mais toujours confronté à une erreur. L'erreur que je reçois pour cela est :
La signature de l'expression Lambda ne correspond pas à la signature de la méthode d'interface fonctionnelle accept(String, String)
3 answers
Read la javadoc: Map<K, V>.forEach()
attend un BiConsumer<? super K,? super V>
comme argument, et la signature de la BiConsumer<T, U>
méthode abstraite est accept(T t, U u)
.
Vous devriez donc lui passer une expression lambda qui prend deux entrées comme 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 d'entrées de la carte, pas sur la carte elle-même:
map.entrySet().forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Peut-être la meilleure façon de répondre aux questions comme "quelle version est plus rapide et laquelle dois-je utiliser?"est de regarder le code source:
carte.forEach () - de la carte.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);
}
}
carte.entrySet().forEach () - de Itérable.java
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
Ceci révèle immédiatement que map.forEach () utilise également Map.Entrée en interne. Donc, je ne m'attendrais à aucun avantage de performance en utilisant carte.forEach () sur la carte .entrySet().forEach () . Donc, dans votre cas, la réponse dépend vraiment de vos goûts personnels :)
Pour la liste complète des différences, veuillez vous référer aux liens javadoc fournis. Amusez-vous bien!
Vous pouvez utiliser le code suivant pour vos besoins
map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));