Ну, не совсем из коробки (в том смысле, что вы получаете Map<String, Int>
сразу), но как насчет filterValues
?
testData.filterValues { it != null } // gives Map<String, Int?> but without null-values
Комбинируя или заменяя это на mapValues
(возможно, вы можете использовать значение по умолчанию вместо null
?):
// combining:
testData.filterValues { it != null }
.mapValues { (_, value) -> value as Int }
// replacing:
testData.mapValues { (_, value) -> value ?: /* default value */ 0 }
Оба дают Map<String, Int>
, но первый создает и заполняет 2 карты под капотом, а второй использует 0
вместо null
.
Вы также можете упростить filterValues
-вариант с соответствующим неконтролируемым приведением , так как «мы знаем это лучше»:
testData.filterValues { it != null } as Map<String, Int> // unchecked cast, because: we really do know better, do we? ;-)
Кроме того, вы также можете просто обработать все записи, как вы уже знали (используя mapNotNull
), а затем создать из него новую карту:
testData.asSequence()
.mapNotNull { (key, value) ->
value?.let {
key to it
}
}
.toMap() // giving Map<String, Int>
Если вам требуется чаще, вы даже можете захотеть использовать собственную функцию расширения:
@Suppress("UNCHECKED_CAST")
fun <K, V> Map<K, V?>.filterValuesNotNull() = filterValues { it != null } as Map<K, V>
Теперь вы можете использовать его следующим образом:
testData.filterValuesNotNull() // giving Map<String, Int>