我目前正在使用Kotlin函数从具有键值对的Json结构中提取地图。
用于构建地图的JSON包含一个标签和一个值:
"values": [
{
"label": "Email",
"value": "email"
},
{
"label": "Social media",
"value": "socialMedia"
},
{
"label": "Word of mouth",
"value": "wordOfMouth"
},
{
"label": "Newspaper",
"value": "newspaper"
}
],
JSON"标签"应成为地图的关键和价值"它的价值。
这是用于使用Java 8的流收集方法将JSON提取并转换为地图的代码。
fun extractValue(jsonNode: JsonNode?): Map<String, String> {
val valuesNode = jsonNode?.get("values") ?: mapper.createArrayNode()
return valuesNode.map { Pair(it.get("label")?.asText() ?: "", it.get("value")?.asText() ?: "") }
.stream().collect({ HashMap<String, String>()}, { m, p -> m.put(p.first, p.second) } , { m, p -> })
}
你如何使用stream()编写部分。在惯用的Kotlin中收集?您有什么替代方案可以替换
流()。收集()
在这种特殊情况下?
答案 0 :(得分:3)
所以你有一个对列表,你想将它转换成地图?您只需用Kotlin .stream().collect(...)
替换toMap()
即可。
来自Kotlin文档:
fun <K, V> Iterable<Pair<K, V>>.toMap(): Map<K, V>
返回 包含来自给定集合的所有键值对的新映射 对
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-map.html
答案 1 :(得分:2)
我相信toMap
来电应该可以在这里工作,因为你有一个Iterable of Pairs:
valuesNode.map { Pair(it.get("label")?.asText() ?: "", it.get("value")?.asText() ?: "") }.toMap()
答案 2 :(得分:2)
associateBy方法与java while read -n 1 char
类似,因此您只需在kotlin中完成,如下所示:
Collectors#toMap