Фильтрация ненулевых значений из коллекции в kotlin - PullRequest
0 голосов
/ 15 февраля 2019

Взгляните на этот kotlin one liner:

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

Компилятор выдает ошибку типа в этой строке, говоря, что список значений NULL не может быть назначен списку ненулевых.Но условный фильтр гарантирует, что список будет содержать только ненулевые значения.Есть ли что-то похожее на оператор !!, который я могу использовать в этой ситуации для компиляции этого кода?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Кажется логичным предположить, что компилятор будет учитывать предикат

it != null

и выводит тип как

List<NonNullType>

, но это не так.Есть 2 решения:

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

или

val nonNullList: List<NonNullType>  = nullableArray.mapNotNull { it }
0 голосов
/ 16 февраля 2019

Вы не можете присвоить типу NULL для значения, не допускающего значения NULL.Сопоставление типов может работать, когда вы присваиваете значение, а не после filter вызванной операции.

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

вместо этого, если вы хотите сделать это без ошибок или без относительно типа.Удалите тип из val, чтобы он выглядел следующим образом

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

Надеюсь, это поможет

0 голосов
/ 15 февраля 2019

Насколько я знаю, вы не можете преобразовать обнуляемые типы в ненулевые типы, просто проверив, что они не являются нулевыми.Чтобы достичь того, что вы хотите, вам нужно вручную отобразить обнуляемые значения в ненулевой тип, просто создав объект типа NonNull.Для этого вы можете использовать функцию расширения карты.

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

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

Или вы можете использовать метод filterNotNull(), как предложено в комментариях @forpas

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

Надеюсь, это поможет вам!

...