2017-06-25 45 views
3

我目前使用Kotlin函數從鍵值對中提取Json結構以外的映射。替換Kotlin本地解決方案中的流收集

的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

因此,你有一個對列表,你想要將其轉換爲地圖?您可以用Kotlin的toMap()替換您的.stream().collect(...)。 從科特林文檔:

fun <K, V> Iterable<Pair<K, V>>.toMap(): Map<K, V>

返回 含有從 對給定的集合中的所有鍵值對新地圖。

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-map.html

+0

是的,這是我想要的。我也檢查它和* toMap()*正常工作。 –

2

我相信toMap調用應該在這裏工作,你有對的可迭代:

valuesNode.map { Pair(it.get("label")?.asText() ?: "", it.get("value")?.asText() ?: "") }.toMap() 
2

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 
}