Java 替换Kotlin本机解决方案中的流收集
我目前正在使用Kotlin函数从带有键值对的Json结构中提取映射 用于构建映射的JSON包含一个标签和一个值: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
"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()工作正常。