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 }
この質問はjustでnullを削除することではなく、型システムに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)
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
}
あなたも使うことができます
mightContainsNullElementList.removeIf { it == null }