如何从LinkedHashMap迭代器获取键值对?

时间:2013-09-19 16:21:52

标签: java iterator linkedhashmap

我测试SnakeYAML库以读取.yaml文档。我看过例2.27。来自http://yaml.org/spec/1.1/的发票,我得到了对象:

System.out.println(content);
Yaml yaml = new Yaml();
Object o = yaml.load(content);

其中content是使用Files.readAllBytes从文件加载的String,encoding.decode(编码为StandardCharsets.UTF_8)

反射让我觉得o是java.util.LinkedHashMap的类型,我可以迭代它们:

Set entrySet = o.entrySet();
Iterator it = entrySet.iterator();
System.out.println("LinkedHashMap entries : ");
while (it.hasNext())
{
    Object entry = it.next();
    System.out.println(entry);
}

Reflection返回该类型的条目是LinkedHashMap $ Entry。但问题:内部类LinkedHashMap $ Entry是私有的,我无法声明此类型的对象。 我如何从entry,iterator或entrSet获得对?

2 个答案:

答案 0 :(得分:5)

您应该声明Map.Entry而不是LinkedHashMap.Entry

while (it.hasNext())
{
    Map.Entry<?,?> entry = it.next();
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());
}

Map.Entrypublic interfaceLinkedHashMap.Entry是该界面的私有实现。

请注意,我还使用Entry声明了<?,?>,这是generic declaration。如果您知道Map的类型,则可以声明该类型,并且您不需要进行投射:

Set<Entry<?,?>> entrySet = o.entrySet();
Iterator<Entry<?,?>> it = entrySet.iterator();

此外,您可以使用增强的foreach循环来迭代:

final Map<?,?> myMap = (Map<?,?>) yaml.load(content);
for(final Entry<?,?> entry : o.entrySet()) {
    //do stuff with entry
}

显然,如果您知道自己的Map已将String映射到Object(例如),则可以使用Map<String, Object>

答案 1 :(得分:1)