替换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 }