在java中迭代LinkedHashMap列表

时间:2017-06-25 22:39:59

标签: java yaml

我正在使用LinkedHashMap在读取yaml文件时保留顺序。

fun extractValue(jsonNode: JsonNode?): Map<String, String> {
    //                              key mapping  ---v
    return jsonNode?.get("values")?.associateBy({ it.get("label")?.asText()?:"" }){
        it.get("value")?.asText() ?: "" // value mapping
    } ?: emptyMap()
    //   ^--- default value is an empty map
}

获得以下错误:

  

线程中的异常&#34; main&#34; java.lang.ClassCastException:   java.util.HashMap无法强制转换为java.util.LinkedHashMap

1 个答案:

答案 0 :(得分:0)

编辑:感谢评论,我现在意识到订购很重要(我在原来的答案中错过了这一点)。真正的问题是YamlReader内部没有使用LinkedHashMap,因此当您访问列表的每个元素时,订单已经丢失。

如果您可以访问阅读器的代码,也许您可​​以对其进行修改,以便内部使用LinkedHashMap代替HashMap。如果你不这样做,也许你可以使用Jackson extension for YAML

现在我原来的答案......

错误说明了一切:HashMap无法投放到LinkedHashMap。因此,如果您转向HashMap而不是LinkedHashMap,那么您就可以了。但是在客户端代码中使用特定实现通常被认为是不好的做法,因为您不知道YamlReader创建的地图的具体类。相反,您应该只使用界面Map

reader = new YamlReader(new FileReader(file));
read_contents = (Map<String, List<Map<String, Object>>>) reader.read();
List<Map<String, Object>> all_items = read_contents.get("XYZ");

for (Map<String, Object> item : all_items) {
    for (Map.Entry<String, Object> entry : item.entrySet()) {
        // <some code>
    }
}

这更安全,因为你编程到接口而不是具体类,这是一个基本的编程原则。

使用Java 8,您可以通过更紧凑的代码实现相同的目标:

all_items.forEach(item -> item.forEach((k, v) -> /* <some code> */));