替换Kotlin本地解决方案中的流收集
我正在使用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中收集? 你有什么替代品,你必须取代
流()。收集()
在这个特定的情况下?
所以你有一个对列表,你想把它转换成一个地图? 你可以使用Kotlin的toMap()
来替换.stream().collect(...)
toMap()
。 从Kotlin文档:
fun <K, V> Iterable<Pair<K, V>>.toMap(): Map<K, V>
返回包含来自给定collection对的所有键 – 值对的新映射。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-map.html
我相信一个toMap
调用应该在这里工作,因为你有一个可toMap
的Iterable:
valuesNode.map { Pair(it.get("label")?.asText() ?: "", it.get("value")?.asText() ?: "") }.toMap()
associateBy方法就像java Collectors#toMap
,所以你可以简单地在kotlin中完成它,如下所示:
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 }