цикл foreach в Java 8 для ввода карты
Я пытаюсь преобразовать старые обычные для каждого цикла до 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)
3 ответов:
читать javadoc:
Map<K, V>.forEach()ждетBiConsumer<? super K,? super V>как аргумент, так и подписьBiConsumer<T, U>абстрактный метод этоaccept(T t, U u).поэтому вы должны передать ему лямбда-выражение, которое принимает два входа в качестве аргумента: ключ и значение:
map.forEach((key, value) -> { System.out.println("Key : " + key + " Value : " + value); });ваш код будет работать, если вы вызвали forEach () на наборе записей карты, а не на самой карте:
map.entrySet().forEach(entry -> { System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue()); });
может быть, лучший способ ответить на такие вопросы, как "какая версия быстрее и какой из них я должен использовать?"стоит посмотреть на исходный код:
карта.forEach () - С карты.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); } }карта.entrySet().forEach () - от Iterable.java
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }это сразу показывает, что карта.forEach () также используя карта.Запись внутренне. Поэтому я не ожидал бы никакого преимущества производительности при использовании карта.forEach () на карта.entrySet().forEach (). Так что в вашем случае ответ действительно зависит от вашего личного вкуса :)
для получения полного списка различий, пожалуйста, обратитесь к предоставленным ссылкам javadoc. Счастливого кодирования!
вы можете использовать следующий код для вашего требования
map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
Comments