Java 替换Kotlin本机解决方案中的流收集

Java 替换Kotlin本机解决方案中的流收集,java,kotlin,Java,Kotlin,我目前正在使用Kotlin函数从带有键值对的Json结构中提取映射 用于构建映射的JSON包含一个标签和一个值: "values": [ { "label": "Email", "value": "email" }, { "label": "Social media", "value": "socialMedia" }, { "label": "Word of mouth", "value": "wordOfMouth" }, { "label": "Newspape

我目前正在使用Kotlin函数从带有键值对的Json结构中提取映射

用于构建映射的JSON包含一个标签和一个值:

"values": [
{
  "label": "Email",
  "value": "email"
},
{
  "label": "Social media",
  "value": "socialMedia"
},
{
  "label": "Word of mouth",
  "value": "wordOfMouth"
},
{
  "label": "Newspaper",
  "value": "newspaper"
}
],
JSON“标签”应该成为映射的键,“值”应该成为其值

这是用于使用Java8的流收集方法提取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 -> })
}
fun extractValue(jsonNode:jsonNode?):映射{
val valuesNode=jsonNode?.get(“值”)?:mapper.createArrayNode()
返回值node.map{Pair(it.get(“label”)?.asText()?:“”,it.get(“value”)?.asText()?:“”)}
.stream().collect({HashMap()},{m,p->m.put(p.first,p.second)},{m,p->})
}
如何用惯用的Kotlin编写带有stream()的part.collect?你有什么替代品

stream().collect()


在这种特定情况下?

那么您有一个对列表,并希望将其转换为映射?你可以用Kotlin的
toMap()
替换你的
.stream().collect(…)
。 从Kotlin文档中:

fun Iterable.toMap():Map

返回 一个新的映射,其中包含给定集合中的所有键值对 成对的

我认为在这里打电话应该有效,因为你有一对对:

valuesNode.map { Pair(it.get("label")?.asText() ?: "", it.get("value")?.asText() ?: "") }.toMap()
该方法类似于java
收集器#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
}
fun extractValue(jsonNode:jsonNode?):映射{
//键映射--v
返回jsonNode?.get(“values”)?.associateBy({it.get(“label”)?.astex()?:“”}){
it.get(“value”)?.asText()?:“”//值映射
}?:清空映射()
//^---默认值为空映射
}

是的,这正是我想要的。我也检查过了,toMap()工作正常。