您有一个可为空的字符串列表。
mapNotNull
将转换函数应用于列表中的每个元素,然后检查此函数的结果是否为null。因此,在这种情况下,它将在transformer
函数中传递可为空的字符串,并且该函数绝对不能为(String) -> String?
类型,因为此处的参数是不可为空的字符串。
您应该将转换器函数声明为(String?) -> String?
,或者在调用mapNotNull
之前从列表中删除null:
items.filterNotNull().mapNotNull(transformer)
另一种选择是将transformer
包装到一个lambda函数中,然后再将其传递给mapNotNull
并在那里处理空元素,例如:
items.mapNotNull { e -> e?.let(transformer) }
仅当元素不为null时,这才将transformer
函数应用于元素。
,
mapNotNull
函数定义为:
public inline fun <T,R : Any> Iterable<T>.mapNotNull(transform: (T) -> R?): List<R>
换句话说,transform
lambda的参数类型为T
,其中T
是要操作的Iterable
的类型。在您的情况下,您的可迭代项是List
类型的String?
。
因此,您需要将转换器声明为(String?) -> String?
类型,并且该转换中仅包含非空结果。
要更新您在play.kotlinlang上提供的代码,请进行一些其他修改以使类型声明更符合习惯用法-注意,尽管使用了多余的代码,但我基本上还是保留了代码transform
功能:
val items = listOf<String?>(null,"cosa")
fun transform (transformer: (String?) -> String?): List<String> {
return items.mapNotNull(transformer)
}
fun main() {
val items = listOf<String?>(null,"cosa")
val transformer: (String?) -> String? = {
// this of course means the output of transform will always be empty
null
}
val map = transform(transformer)
print(map)
}
本文链接:https://www.f2er.com/3112926.html