<本文学习郭神《第三行代码》总结>
扩展函数:在不修改某个类源码的情况下,仍然可以打开这个类,向这个类添加新的函数。
扩展函数可以让API更简洁,更加面向对象。
定义扩展函数的语法结构:
fun ClassName.methodName(param1:Int, param2:Int):Int {
//结构体
return 0
}
例如:一段字符串可能包含字母、数字、特殊字符等字符,现在需要统计字符串中字母的数量,如果按照一般写法:
object StringUtil {
fun letters(str: String): Int {
var count = 0
for (char in str){
if (char.isLetter()){
count ++
}
}
return count
}
}
这里定义一个StringUtil的单例类,然后定义一个方法letters,接收一个字符串参数,返回一个整型,使用for循环遍历,每查出一个字母,count计数加1。
工具类写好了,那么现在调用该方法:
val str = "ahufh18294#$$%"
val count = StringUtil.letters(str)
这种是常规写法,也是最标准的实现思维。
但是使用扩展函数,就会不一样了,一种更加面向对象的思维方式实现该功能,比如将上述的letters方法添加到String类中。
因为向String类中添加一个扩展函数,首先要新建一个String.kt 文件。
注意:(1)这里文件名没有固定要求,只是为了方便知道向哪一个类中添加扩展函数,所以建议使用相同的类名。
(2)扩展函数也可以定义在任何一个现有类中。
(3)最好定义成顶层方法,这样可以进行全局访问域。
上述代码就可以修改为:
fun **String**.letters() : Int{
var count = 0
for (char in this){
if (char.isLetter()){
count ++
}
}
return count
}
这里是顶层方法。
现在将letters()方法定义为了String类的扩展函数,那么函数中就自动拥有了String实例的上下文,因此letters函数就不需要接收一个字符串参数了,而是直接遍历this即可。
接下来调用该方法就可以直接写成:
val str = "ahufh18294#$$%".letters()