цикл 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)

696   3  

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

    Ничего не найдено.