Kotlin:消除列表中的空值(或其他功能转换)

时间:2016-07-22 21:28:29

标签: types filter nullable kotlin

问题

在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 }

这个问题不是只是关于消除空值,而是使类型系统认识到转换中从集合中删除了空值。

我不想循环,但如果这是最好的方法,我会的。

变通

以下编译,但我不确定这是最好的方法:

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)

3 个答案:

答案 0 :(得分:42)

您可以使用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
}

答案 1 :(得分:0)

您也可以使用

mightContainsNullElementList.removeIf { it == null }

答案 2 :(得分:0)

val strs1 = listOf("hello", null, "world") // [hello, null, world]
val strs2 = strs1.filter { !it.isNullOrBlank() } // [hello, world]