4
votes

Filtrer les valeurs non nulles d'une collection dans Kotlin

Jetez un oeil à cette ligne de kotlin one:

val nonNullArr : List<NonNullType> = nullArray.filter {it != null}

Le compilateur donne une erreur de type à cette ligne, disant qu'une liste de nullables ne peut pas être assignée à une liste de non- nulls. Mais le filtre conditionnel garantit que la liste ne contiendra que des valeurs non nulles. Y a-t-il quelque chose de similaire à l'opérateur !! que je peux utiliser dans cette situation pour faire compiler ce code?


1 commentaires

Utilisez plutôt nullArray.filterNotNull () .


4 Réponses :


0
votes

Autant que je sache, vous ne pouvez pas convertir les types Nullable en types non Null en vérifiant simplement qu'ils ne sont pas Null. Pour obtenir ce que vous voulez, vous devez mapper manuellement les valeurs Nullable à un type non Null en créant simplement un objet de type NonNull. Pour cela, vous pouvez utiliser la fonction d'extension de carte.

val nonNullList: List<String>  = nullableArray.filterNotNull()

Ou vous pouvez utiliser la méthode filterNotNull () comme @forpas suggéré dans les commentaires

val nullableArray: Array<String?> = arrayOf("abc", "xyz", null, "efg")

val nonNullList: List<String> = nullableArray.filter { it != null }.map {
    it.toString()
}


0 commentaires

8
votes

Il semble logique de supposer que le compilateur prendrait en compte le prédicat

val nonNullList: List<NonNullType>  = nullableArray.mapNotNull { it }

et inférerait le type comme

val nonNullList: List<NonNullType>  = nullableArray.filterNotNull()

mais il ne fait pas.
Il existe 2 solutions:

List<NonNullType>

ou

it != null


2 commentaires

que se passe-t-il si List a des objets non nuls mais je veux filtrer en fonction d'une clé de cet objet dont la valeur est nulle Que diriez-vous de faire ça?


@zero mappe d'abord la liste sur la clé, puis filtre non nul et filtre la liste d'origine en fonction de l'égalité des résultats.



1
votes

Vous ne pouvez pas attribuer un type Nullable à un type de valeur non Nullable. La correspondance de type fonctionne peut-être lorsque vous attribuez une valeur, pas après l'opération filter appelée.

val nonNullArr = nullArray.filter {it != null} 

à la place, si vous voulez faire cela sans erreur ou sans souci le type. Supprimez le type du val , donc ça va comme ça

// the type-matching works before `.filter` is called
val nonNullArr : List<NonNullType> = nullArray//.filter {it != null} 

J'espère que ça aide


0 commentaires

0
votes

essayez d'utiliser listOfNotNull au lieu de listOf (), cela équivaut à list.filterNotNull()


0 commentaires