web-dev-qa-db-fra.com

Kotlin: éliminer les null d'une liste (ou autre transformation fonctionnelle)

Problème

Quelle est la manière idiomatique de contourner cette limitation de la sécurité nulle dans le système de type Kotlin?

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 }

Cette question n'est pas juste d'éliminer les null, mais aussi de faire reconnaître au système de type que les null sont supprimés de la collection par la transformation.

Je préfère ne pas faire de boucle, mais je le ferai si c'est la meilleure façon de le faire.

Solution de contournement

Ce qui suit se compile, mais je ne suis pas sûr que ce soit la meilleure façon de le faire:

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)
25
GlenPeterson

Vous pouvez utiliser filterNotNull

Voici un exemple simple:

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

Mais sous le capot, stdlib fait la même chose que vous avez écrit

/**
 * 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
}
49
SerCe

vous pouvez aussi utiliser

mightContainsNullElementList.removeIf { it == null }
0
gderaco