我试图将每个循环的旧常规转换为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)
答案 0 :(得分:154)
阅读the javadoc:Map<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);
}
}
map.entrySet()。forEach() - 来自Iterable.java
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
这立即显示 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)
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());
}
3 流 map.entrySet().stream() .forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));