我正在尝试将旧版的传统for each循环转换成Java 8的Map entry set的for each循环,但是我遇到了错误。以下是我正在尝试转换的代码:
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)
的签名不匹配。
Map.Entry
实例;而第一个版本可以直接给你键和值,无需实例化。因此,Map.Entry
是一个中间人,你可以使用第一个版本来避免它。 - Marko TopolnikMap
实现,Map.Entry
实例在迭代之前已经存在,不需要创建。但是,在操作中不必处理Map.Entry
可以提高可读性,并具有稍微更好的性能潜力,因为不需要调用额外的方法来检索键和值。 - HolgerMap
实现来说是正确的,而ConcurrentHashMap
则是一个重要的反例。 - Marko TopolnikConcurrentHashMap
时,临时条目实例是最不用担心的事情。尽管如此,我们仍然同意更喜欢使用map.forEach((key, value) -> …);
... - Holger