如何解决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 举报,一经查实,本站将立刻删除。