接收转换映射函数发送到`List <>。mapNotNull()`

我正在尝试编写类似transform的函数,该函数接收将在mapNotNull内部使用的函数,但我找不到解决方法。

示例

val items: List<String?> = listOf(null,"cosa")

fun transform(transformer: (String) -> String?) {
    items.mapNotNull(transformer) // <-------------------------------------- THIS DOES NOT COMPILE
}

fun main() {
    val items: List<String?> = listOf(null,"cosa")

    val transformer: (String) -> String? = {
        null    
    }

    val map = transform(transformer)

    print(map)

}

您可以在此处查看其工作方式:play.kotlinlang

如何声明fun transform的参数才能将其传递到mapNotNull内部?

benbene110 回答:接收转换映射函数发送到`List <>。mapNotNull()`

您有一个可为空的字符串列表。

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

大家都在问