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)

Author: Tagir Valeev, 2015-08-28

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());
}); 
 123
Author: JB Nizet, 2015-08-28 07:16:44

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

Javadoc

carte.entrySet().forEach () - de Itérable.java

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

Javadoc

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!

 8
Author: Evgeny Tugarev, 2016-12-02 12:49:15

Vous pouvez utiliser le code suivant pour vos besoins

map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
 4
Author: Shridhar Sangamkar, 2017-03-22 12:26:20