Значения карты массивов JsonNode в Котлине - PullRequest
0 голосов
/ 04 июня 2019

У меня есть два объекта JsonNode, которые являются массивами, возвращаемыми вызовами API, и выглядят так:

exportedNodeArray:

[
    {"key":"111", "value":"aaa"},
    {"key":"222", "value":"bbb"},
    {"key":"333", "value":"ccc"}
]

localNodeArray

[
    {"key":"999", "value":"aaa"},
    {"key":"888", "value":"bbb"},
    {"key":"777", "value":"ccc"}
]

Требуется выводКарта любых ключей, которые соответствуют одинаковым значениям в каждом массиве.Значения гарантированно будут уникальными в пределах массива.

"111"="999"
"222"="888"
"333"="777"

Эта функция возвращает правильный результат, но выглядит очень не элегантным способом сделать это.

fun mapIds(exportedNodeArray: JsonNode, localNodeArray: JsonNode) : MutableMap<String, String?> {
    val localMap = mutableMapOf<String, String>()
    localNodeArray.forEach {
        localMap[it["value"].asText()] = it["key"].asText()
    }
    val idMap = mutableMapOf<String, String?>()
    exportedNodeArray.forEach {
        idMap[it["key"].asText()] = localMap[it["value"].asText()]
    }
    return idMap
}

IЯ новичок в Kotlin, и хотел бы понять более функциональный подход.Особенно, если есть способ получить доступ к элементам JsonNode по значению атрибута и выполнить это за один цикл или вызов карты.

1 Ответ

0 голосов
/ 04 июня 2019

Если вы определите еще одну функцию, она может выглядеть следующим образом:

fun mapIds(exportedNodeArray: JsonNode, localNodeArray: JsonNode) : Map<String, String> {
    val localConverted = convert(localNodeArray)
    return convert(exportedNodeArray)
        .filterKeys(localConverted::containsKey)
        .map { it.value to localConverted.getValue(it.key) }
        .toMap()
}

fun convert(node: JsonNode): Map<String, String> = node.associate {
    it["value"].asText() to it["key"].asText() 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...