Kotlin扩展String类方法无法在Lambda中使用的问题求助
问题分析与解决
核心问题
你定义的扩展函数写法错误,导致方法引用类型不匹配:
- 原本想写String的扩展函数,但额外添加了一个
String参数s,让函数变成了需要两个String参数(扩展接收者+传入参数)的KFunction2<String,String,String>; - 而
map操作需要的是单参数函数(String) -> String,因此出现类型不兼容错误。
修正后的扩展函数
去掉多余的参数,直接利用扩展函数的接收者this(即调用该方法的String对象),同时修正正则表达式的错误(原[^a-ZA-Z0-9]中a-Z会包含非字母符号,应改为a-zA-Z):
fun String.removeNonAlphanumeric() = this.replace("[^a-zA-Z0-9]".toRegex(), "")
修正后的调用代码
现在方法引用String::removeNonAlphanumeric会被识别为(String) -> String,可以直接在map中使用:
s.split("\\s+".toRegex()) .map(String::removeNonAlphanumeric) .toList()
为什么标准库方法可以直接引用
像Strings.kt里的标准库扩展函数(比如String.trim()),都是无额外参数的扩展函数,它们的方法引用String::trim正好是map需要的(String) -> String类型,因此可以直接使用。
内容的提问来源于stack exchange,提问作者user19320502
相关产品推荐
相关产品推荐

