Kotlin: исключить null из списка (или другого функционального преобразования)

Проблема

Каков идиоматический способ работы с этим ограничением нулевой безопасности в системе типа Котлин?

val strs1:List<String?> = listOf("hello", null, "world")

// ERROR: Type Inference Failed: Expected Type Mismatch:
// required: List<String>
// round:    List<String?>
val strs2:List<String> = strs1.filter { it != null }

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

Я бы предпочел не зацикливаться, но я буду, если это лучший способ сделать это.

обходным

Следующие компиляции, но я не уверен, что это лучший способ сделать это:

fun <T> notNullList(list: List<T?>):List<T> {
    val accumulator:MutableList<T> = mutableListOf()
    for (element in list) {
        if (element != null) {
            accumulator.add(element)
        }
    }
    return accumulator
}
val strs2:List<String> = notNullList(strs1)

Ответ 1

Вы можете использовать filterNotNull

Вот простой пример:

val a: List<Int?> = listOf(1, 2, 3, null)
val b: List<Int> = a.filterNotNull()

Но под капотом stdlib делает то же, что вы написали

/**
 * Appends all elements that are not `null` to the given [destination].
 */
public fun <C : MutableCollection<in T>, T : Any> Iterable<T?>.filterNotNullTo(destination: C): C {
    for (element in this) if (element != null) destination.add(element)
    return destination
}