Я пытаюсь преобразовать старый стандарт для каждого цикла до java7 в java8 для каждого цикла для набора записей карты, но я получаю сообщение об ошибке. Вот код, который я пытаюсь преобразовать:
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}
Вот изменения, которые я сделал:
map.forEach( Map.Entry<String, String> entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Я тоже пробовал это делать:
Map.Entry<String, String> entry;
map.forEach(entry -> {
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
});
Но все еще сталкивается с ошибкой. Ошибка, которую я получаю, следующая: подпись лямбда-выражения не соответствует подписи метода функционального интерфейса.accept(String, String)
Map.Entry
создавать экземпляр для каждой записи; первый дает вам ключ и значение без создания экземпляра. СледовательноMap.Entry
, это посредник, и вы можете избежать этого, используя первую версию.Map
реализацийMap.Entry
экземпляры уже существуют до итерации, и их не нужно создавать. Тем не менее, отсутствие необходимости иметь дело сMap.Entry
действием является преимуществом для удобочитаемости и имеет небольшой потенциал для повышения производительности, поскольку для получения ключа и значения не требуется дополнительных вызовов методов.Map
реализаций, которые верны,ConcurrentHashMap
являются важным контрпримером.ConcurrentHashMap
временные экземпляры записей - это последнее, о чем следует беспокоиться. Тем не менее, мы согласны вmap.forEach((key, value) -> …);
любом случае отдать предпочтение …Может быть, лучший способ ответить на вопросы типа «какая версия быстрее и какую мне использовать?» посмотреть на исходный код:
map.forEach () - из 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 () - из Iterable.java
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
javadoc
Это сразу показывает, что map.forEach () также использует Map.Entry для внутренних целей . Поэтому я бы не ожидал какого-либо повышения производительности при использовании map.forEach () по сравнению с map.entrySet (). ForEach () . Так что в вашем случае ответ действительно зависит от вашего личного вкуса :)
Полный список различий см. По предоставленным ссылкам на javadoc. Удачного кодирования!
источник
Вы можете использовать следующий код для вашего требования
map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
источник
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); });
источник
Stream API
public void iterateStreamAPI(Map<String, Integer> map) { map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":"e.getValue())); }
источник
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());
источник