使类(包装Map)可用于Java中的for循环

时间:2018-02-09 10:13:13

标签: java

我有一个类基本上是Map的包装(显然也包含一些业务逻辑)。 我希望能做到的是:

for(Object o: instanceOfMyClass) { ... }

所以我想循环我班级里面的Map值。我需要在我的课程中实现哪些接口(Iterator,Iterable,...)? 我想在接口上实现我不知何故需要返回一个Interator;我如何“重用”Map的迭代器(通过Map.entrySet()),记住我只想在我的类的迭代器中公开值?

非常感谢!

2 个答案:

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