1

有没有办法在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);
        });
    }
}

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

任何想法如何在 Eclipse Collections 地图上编写简单的循环?

4

1 回答 1

4

评论中绿巨人和巴兹尔的建议很好。我将为您的代码提供一个测试,以供将来参考。

@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 的外部范围引用非 final 的任何内容的缺点。如果您想在内部迭代器内部有一个简单的计数器,您可以使用CounterEclipse Collections 中可用的类。

@Test
public void forEachKeyValueWithCounter()
{
    IntObjectHashMap<String> map = new IntObjectHashMap<>();
    map.put(1, "one");
    map.put(2, "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());
}
于 2021-01-29T04:37:11.027 回答