2017-06-25 3 views
3

Ich verwende derzeit eine Kotlin-Funktion, um eine Karte aus einer Json-Struktur mit Schlüssel-Wert-Paare zu extrahieren.Ersetzen Strom in Kotlin native Lösung sammeln

Die JSON verwendet, um die Karte zu bauen, ist enthält ein Label und ein Wert:

"values": [ 
{ 
    "label": "Email", 
    "value": "email" 
}, 
{ 
    "label": "Social media", 
    "value": "socialMedia" 
}, 
{ 
    "label": "Word of mouth", 
    "value": "wordOfMouth" 
}, 
{ 
    "label": "Newspaper", 
    "value": "newspaper" 
} 
], 

Die JSON „label“ sollte der Schlüssel der Karte und den „Wert“ sein Wert werden.

Dies ist der Code zum Extrahieren und Konvertieren des JSON in eine Map mit der Stream-Collect-Methode von Java 8.

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 -> }) 
} 

Wie schreibe ich den Teil mit stream(). In idiomatic Kotlin sammeln? Welche Alternativen haben Sie

Strom(). Sammeln()

in diesem speziellen Fall zu ersetzen?

Antwort

3

Sie haben also eine Liste von Paaren, und Sie möchten es in eine Karte konvertieren? Sie können einfach Ihre .stream().collect(...) durch Kotlin toMap() ersetzen. Aus dem Kotlin docs:

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

Returns eine neue Karte alle Schlüssel-Wert-Paare aus der gegebenen Sammlung von Paaren enthält.

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

+0

Ja, das ist, was ich wollte. Ich habe es auch überprüft und * toMap() * funktioniert gut. –

2

Ich glaube, ein toMap Anruf hier arbeiten sollten, wie Sie ein Iterable von Paaren haben:

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

die associateBy Methode ist wie als Java Collectors#toMap, so dass man es einfach getan werden kann in kotlin wie folgt:

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 
}