web-dev-qa-db-ja.com

Kotlin:リスト(または他の機能変換)からnullを削除します

問題

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

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

あなたも使うことができます

mightContainsNullElementList.removeIf { it == null }
0
gderaco