it-swarm.com.de

forEach loop Java 8 für Map entry set

Ich versuche, alte konventionelle für jede Schleife bis Java7 in Java8 für jede Schleife für einen Karteneintragssatz umzuwandeln, aber es wird eine Fehlermeldung angezeigt. Hier ist der Code, den ich konvertieren möchte:

for (Map.Entry<String, String> entry : map.entrySet()) {
        System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
    }

Hier sind die Änderungen, die ich vorgenommen habe:

map.forEach( Map.Entry<String, String> entry -> {
       System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());

   }); 

Ich habe es auch versucht:

Map.Entry<String, String> entry;
   map.forEach(entry -> {
       System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());

   });

Aber immer noch vor einem Fehler. Die Fehlermeldung lautet: Die Signatur des Lambda-Ausdrucks stimmt nicht mit der Signatur der Funktionsschnittstellenmethode accept(String, String) überein.

70

Read the javadoc : Map<K, V>.forEach() erwartet ein BiConsumer<? super K,? super V> Als Argument, und die Signatur der abstrakten Methode BiConsumer<T, U> Lautet accept(T t, U u) .

Sie sollten also einen Lambda-Ausdruck übergeben, der zwei Eingaben als Argument verwendet: den Schlüssel und den Wert:

map.forEach((key, value) -> {
    System.out.println("Key : " + key + " Value : " + value);
});

Ihr Code würde funktionieren, wenn Sie forEach () für den Eintragssatz der Karte aufrufen, nicht für die Karte selbst:

map.entrySet().forEach(entry -> {
    System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}); 
165
JB Nizet

Vielleicht der beste Weg, um Fragen wie "Welche Version ist schneller und welche soll ich verwenden?" Zu beantworten. ist auf den Quellcode zu schauen:

map.forEach () - von 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 () - from Iterable.Java

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

javadoc

Dies zeigt sofort, dass map.forEach () auch Map.Entry im Inneren. Daher würde ich keinen Leistungsvorteil bei der Verwendung von map.forEach () gegenüber map.entrySet () erwarten. forEach () . In deinem Fall hängt die Antwort also wirklich von deinem persönlichen Geschmack ab :)

Die vollständige Liste der Unterschiede finden Sie unter den bereitgestellten Javadoc-Links. Viel Spaß beim Codieren!

13
Evgeny Tugarev

Sie können den folgenden Code für Ihre Anforderung verwenden

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

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