forEach循环Java 8 for Map条目集

我试图将旧的常规每个循环直到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()); }); 

但仍然面临错误。 我得到的错误是:Lambdaexpression式的签名不匹配函数接口方法accept(String, String)的签名,

阅读javadoc : Map<K, V>.forEach()需要一个BiConsumer<? super K,? super V> BiConsumer<? super K,? super V> BiConsumer<? super K,? super V>为参数, BiConsumer<T, U>抽象方法的签名为accept(T t, U u)

所以你应该传递一个lambdaexpression式,它将两个input作为参数:键和值:

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

也许是回答“哪个版本更快,哪个版本可以使用?”的最佳方法。 就是看源代码:

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