2013-09-19 4 views
1

Я тестирую библиотеку SnakeYAML для чтения документов .yaml. Я прочитал Пример 2.27. Счет от http://yaml.org/spec/1.1/ и я получаю объект:Как я могу получить ключ, пару значений из итератора LinkedHashMap?

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

где содержимое строки загружаются из файла с помощью Files.readAllBytes, encoding.decode (кодирование StandardCharsets.UTF_8)

Отражение Гав мне, что о является тип 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); 
} 

Отражение возвращает этот тип записи является LinkedHashMap $ запись. Но есть проблема: внутренний класс LinkedHashMap $ Запись закрыта, и я не могу объявить объекты этого типа. Как я могу получить пару от входа, итератора или entrSet?

+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.Entry является public interface, LinkedHashMap.Entry является частной реализации этого интерфейса.

Обратите внимание, что я также объявляю Entry с <?,?>, это generic declaration. Если вы знаете тип Map вы можете объявить, что тип и вам не нужно будет подавать:

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

Далее вы можете использовать расширенный цикл Еогеасп итерировать:

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

Очевидно, что если вам знать ваше Map является отображение String в Object (например), вы можете использовать Map<String, Object>