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.
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)
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
}
vous pouvez aussi utiliser
mightContainsNullElementList.removeIf { it == null }