微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Eclipse Collections 映射上的简单循环迭代例如:IntObjectHashMap

如何解决Eclipse Collections 映射上的简单循环迭代例如:IntObjectHashMap

有没有办法在 Eclipse Collections 映射上使用简单的 Java for-each 循环?

我正在寻找这样的东西(但对于 Eclipse Collections 地图):

for (Map.Entry<Integer,String> entry : map.entrySet()) {
}

...但我在 Eclipse Collections 地图中找不到类似的东西。

我当然知道这种类型的 Eclipse Collections 迭代:

import org.eclipse.collections.impl.map.mutable.primitive.IntObjectHashMap;

public class Test {
    public static void main(String[] args) {
        IntObjectHashMap<String> map = new IntObjectHashMap<>();
        map.put(1,"one");
        map.put(2,"two");
        int i = 0;
        map.forEachkeyvalue((int key,String val) -> {
            i++; // Compilation error. 
            System.out.println("key: " + key + ",val: " + val);
        });
    }
}

...但是这个构造有一些缺点,例如我不能轻松访问周围的局部变量(如上例所示,由于对局部变量的不正确访问,该示例将无法编译{{ 1}}).

任何想法如何编写简单循环覆盖 Eclipse Collections 地图?

解决方法

Hulk 和 Basil 在评论中的推荐很好。我将为您的代码提供一个测试,以供将来参考。

@Test
public void keyValuesView()
{
    IntObjectHashMap<String> map = new IntObjectHashMap<>();
    map.put(1,"one");
    map.put(2,"two");
    int i = 0;
    for (IntObjectPair<String> pair : map.keyValuesView())
    {
        i++;
        System.out.println("key: " + pair.getOne() + ",val: " + pair.getTwo());
    }
    Assert.assertEquals(2,i);
}

最好的选择是在您的问题中使用内部迭代器,因为迭代时生成的垃圾会更少(每个键/值对的 IntObjectPair)。这带来了无法从非最终的 lambda 外部范围引用任何内容的缺点。如果您想为内部迭代器内部的事物创建一个简单的计数器,您可以使用 Eclipse Collections 中提供的 Counter 类。

@Test
public void forEachKeyValueWithCounter()
{
    IntObjectHashMap<String> map = new IntObjectHashMap<>();
    map.put(1,"two");
    Counter counter = new Counter();
    map.forEachKeyValue((int key,String val) -> {
        counter.increment();
        System.out.println("key: " + key + ",val: " + val);
    });
    Assert.assertEquals(2,counter.getCount());
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。