forEach循环Java 8 for Map条目集

时间:2015-08-28 06:38:44

标签: java lambda 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());

   });

但仍面临错误。我得到的错误是: Lambda表达式的签名与功能接口方法accept(String, String)

的签名不匹配

7 个答案:

答案 0 :(得分:154)

阅读the javadocMap<K, V>.forEach()期望BiConsumer<? super K,? super V>为参数,BiConsumer<T, U>抽象方法的签名为accept(T t, U u)

所以你应该传递一个lambda表达式,它接受两个输入作为参数:键和值:

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());
}); 

答案 1 :(得分:11)

也许是回答“哪个版本更快,我应该使用哪个版本?”等问题的最佳方式。是查看源代码:

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.entrySet()。forEach()上使用 map.forEach()有任何性能优势。所以在你的情况下答案真的取决于你的个人品味:)

有关差异的完整列表,请参阅提供的javadoc链接。快乐的编码!

答案 2 :(得分:6)

您可以根据需要使用以下代码

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

答案 3 :(得分:0)

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);
 });

答案 4 :(得分:0)

Stream API

public void iterateStreamAPI(Map<String, Integer> map) {
    map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":"e.getValue()));
}

答案 5 :(得分:0)

<ion-label> {{this.getUser(mensaje.user_id)}} </ion-label>

答案 6 :(得分:0)

下面是树最好的方法 1.用入口集迭代

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ":" + entry.getValue());
}
  1. Lambda map.forEach((k, v) -> System.out.println((k + ":" + v)));

3 流 map.entrySet().stream() .forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));