在原始java源代码中,我必须使用entrySet来迭代一个hashmap,例如:
for (Map.Entry<String, String> e : new Hash<String, String>().entrySet()) {
}
我希望有一种更简单的方法来迭代如下的散列图:
package ro.ex;
import java.util.HashMap;
import java.util.Map;
class Hash<K, V> extends HashMap<K, V> {
// how to implement?
}
public class Ex2 {
public static void main(String[] args) {
// i expect
for (Hash.Entry<String, String > e : new Hash<String, String>()) {
}
}
}
我的问题是如何实现它?
答案 0 :(得分:2)
实施Iterable<Map.Entry<K, V>>
:
class Hash<K, V> extends HashMap<K, V> implements Iterable<Map.Entry<K, V>> {
@Override
public Iterator<Entry<K, V>> iterator() {
return entrySet().iterator();
}
}
这是有效的,因为实现Iterable
允许在for-each循环中使用该类型。
答案 1 :(得分:2)
作为@ August的答案的补充,虽然让Map
直接迭代这样并不困难,但也不是一个好主意。
您已经引入了一个新的Hash
类,它没有提供实质性的新功能。这真的只是一个便利课程。额外的类意味着更多的类来阅读 1 并维护更大的运行时间。
为了使用您的Hash
类,您的其他代码需要编码到Hash
类而不是Map
接口。这使得无法使用不同的Map
实现类型直接替换地图。
您的Hash
课程可能不直观。 Map
有三个(至少)方面可以迭代,但是您选择了一个......原因通常不明显。 (这就是标准Map
API未实现Iterable
的原因!!)
定义HashMap
的子类时,可以防止JIT编译器在某些情况下优化某些方法调用的调度。
现在这些东西都不是“塞子”#34; ...但另一方面,你所取得的成就是在for
循环中保存~10个字符。
1 - 作为原始作者,这对您来说可能不是问题。但是第一次遇到你的Hash
类的其他人必须阅读源代码或者javadoc以找出迭代它真正意味着什么......
答案 2 :(得分:0)
从Java 8开始,迭代HashMap的最佳和最简便方法是使用Lambda表达式。以下是iterate HashMap的代码段,
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Robert", 34);
map.put("Kiran", 29);
map.put("Andy", 44);
map.forEach((key,value) -> {
System.out.println(key);
System.out.println(value);});