Замена сбора потока в собственном решении 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 «label» должен стать ключом к карте и «значить» ее значение.

Это код, используемый для извлечения и преобразования JSON на карту с использованием метода сбора потока 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 -> }) } 

Как вы пишете часть с потоком (). Собираетесь в идиоматическом Котлин? Какие альтернативы вам нужно заменить?

поток (). собирать ()

в этом конкретном случае?

Итак, у вас есть список пар, и вы хотите преобразовать его в карту? Вы можете просто заменить свой .stream().collect(...) на Kotlin's toMap() . Из документов Котлина:

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

Возвращает новую карту, содержащую все пары ключ-значение из данного набора пар.

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

Я считаю, что вызов toMap должен работать здесь, поскольку у вас есть Iterable of Pairs:

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

метод 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 }