web-dev-qa-db-fra.com

ForEach loop Java 8 pour le jeu d'entrées de carte

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)

70
Siddharth Sachdeva

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());
}); 
165
JB Nizet

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);
    }
}

javadoc

map.entrySet (). forEach () - à partir d'Iterable.Java

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

javadoc

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!

13
Evgeny Tugarev

Vous pouvez utiliser le code suivant pour votre besoin

map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
6
Shridhar Sangamkar

Stream API

public void iterateStreamAPI(Map<String, Integer> map) {
    map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":"e.getValue()));
}
0
vivek
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);
 });
0
vaibhav1111