Ich versuche, alte konventionelle für jede Schleife bis Java7 in Java8 für jede Schleife für einen Karteneintragssatz zu konvertieren, aber ich erhalte eine Fehlermeldung. 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 Irrtum. Der Fehler, den ich dafür bekomme, ist: Die Signatur des Lambda-Ausdrucks stimmt nicht mit der Signatur der Funktionsschnittstellenmethode übereinaccept(String, String)
Map.Entry
Erstellung einer Instanz für jeden Eintrag. Der erste gibt Ihnen Schlüssel und Wert ohne Instanziierung. DaherMap.Entry
ist ein Mittelsmann und Sie können dies mit der ersten Version vermeiden.Map
Implementierungen sind dieMap.Entry
Instanzen bereits vor der Iteration vorhanden und müssen nicht erstellt werden. Wenn Sie sich jedoch nicht mitMap.Entry
der Aktion befassen müssen, ist dies ein Gewinn für die Lesbarkeit und bietet ein geringes Potenzial für eine bessere Leistung, da keine zusätzlichen Methodenaufrufe erforderlich sind, um den Schlüssel und den Wert abzurufen.Map
Implementierungen , die wahr ist,ConcurrentHashMap
ein wichtiges Gegenbeispiel zu sein.ConcurrentHashMap
, sind temporäre Eintragsinstanzen das Letzte, worüber Sie sich Sorgen machen müssen. Trotzdem sind wir uns einig, esmap.forEach((key, value) -> …);
trotzdem vorzuziehen ...Vielleicht der beste Weg, um die Fragen zu beantworten wie "Welche Version ist schneller und welche soll ich verwenden?" 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 () - von 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 () wird auch mit Map.Entry intern. Daher würde ich keinen Leistungsvorteil bei der Verwendung von map.forEach () gegenüber map.entrySet (). ForEach () erwarten . 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!
quelle
Sie können den folgenden Code für Ihre Anforderung verwenden
map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
quelle
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); });
quelle
Stream-API
public void iterateStreamAPI(Map<String, Integer> map) { map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":"e.getValue())); }
quelle
String ss = "Pawan kavita kiyansh Patidar Patidar"; StringBuilder ress = new StringBuilder(); Map<Character, Integer> fre = ss.chars().boxed() .collect(Collectors.toMap(k->Character.valueOf((char) k.intValue()),k->1,Integer::sum)); //fre.forEach((k, v) -> System.out.println((k + ":" + v))); fre.entrySet().forEach(e ->{ //System.out.println(e.getKey() + ":" + e.getValue()); //ress.append(String.valueOf(e.getKey())+e.getValue()); }); fre.forEach((k,v)->{ //System.out.println("Item : " + k + " Count : " + v); ress.append(String.valueOf(k)+String.valueOf(v)); }); System.out.println(ress.toString());
quelle