我有一个类基本上是Map的包装(显然也包含一些业务逻辑)。 我希望能做到的是:
for(Object o: instanceOfMyClass) { ... }
所以我想循环我班级里面的Map值。我需要在我的课程中实现哪些接口(Iterator,Iterable,...)? 我想在接口上实现我不知何故需要返回一个Interator;我如何“重用”Map的迭代器(通过Map.entrySet()),记住我只想在我的类的迭代器中公开值?
非常感谢!
答案 0 :(得分:2)
这就像实施Iterable
一样简单。在您的情况下,您希望实现Iterable<SomeType>
:
public class Main implements Iterable<String>
{
private final Map<String, String> myMap = new HashMap<>();
{
myMap.put("hello", "world");
myMap.put("aaa", "bbb");
}
@Override
public Iterator<String> iterator()
{
return Collections.unmodifiableMap(myMap).values().iterator();
}
}
这是一个测试方法,输出如下:
public static void main(String... args)
{
for (String entry : new Main())
{
System.out.println("Value: " + entry);
}
}
价值:bbb
价值:世界
答案 1 :(得分:1)
实施Iterable
允许您使用for(Foo f : foo)
语法,但如果您要重新包装Map
,则可能需要实施Map.forEach()
方法。当你可以直接单独解决密钥和值时,它会更好一点(尽管现在的问题只是访问值)。
// Mostly copied from Map.forEach()
// Adjust generic parameters if necessary
public void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action);
for (Map.Entry<K, V> entry : internalMap.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);
}
}
如果默认实现足够,您当然可以委派给internalMap.forEach(action);
。