更换流在Kotlin原生溶液中收集

时间:2017-06-25 21:03:09

标签: java 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中收集?您有什么替代方案可以替换

  

流()。收集()

在这种特殊情况下?

3 个答案:

答案 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