Types Kotlin:从列表中消除空值(或其他函数转换) 问题

Types Kotlin:从列表中消除空值(或其他函数转换) 问题,types,filter,nullable,kotlin,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&

在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 }
val strs1:List=listOf(“你好”,空,“世界”)
//错误:类型推断失败:预期类型不匹配:
//必填项:列表
//圆桌会议:名单
val strs2:List=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)
fun notNullList(list:list):list{
val累加器:MutableList=mutableListOf()
for(列表中的元素){
if(元素!=null){
累加器。添加(元素)
}
}
回流蓄能器
}
val strs2:List=notNullList(strs1)
您可以使用

下面是一个简单的例子:

val a: List<Int?> = listOf(1, 2, 3, null)
val b: List<Int> = a.filterNotNull()
val a:List=listOf(1,2,3,null)
val b:List=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
}
/**
*将所有不为“null”的元素追加到给定的[destination]。
*/
public fun Iterable.filterNotNullTo(目的地:C):C{
如果(元素!=null)目的地为(此中的元素)。添加(元素)
返回目的地
}
您也可以使用

mightContainsNullElementList.removeIf { it == null }

好极了!啊!为什么我没看到?:-)如果您正在创建列表,您还可以使用
listOfNotNull
I收到一个关于集合类型警告的无用调用。调用可变的list@Xaren它是无用的,因为您的列表不包含任何空值。否则它将是一个
列表。(注意“”)请进一步解释-这一行是做什么的,为什么它能解决给定的问题?请在您的答案中添加一些解释,以便其他人可以从中学习
val strs1 = listOf("hello", null, "world") // [hello, null, world]
val strs2 = strs1.filter { !it.isNullOrBlank() } // [hello, world]