扩展函数
1、扩展函数表示即使在不修改某个类的源码的情况下,仍然可以打开这个类,向该类添加新的函数。
2、语法结构:
fun ClassName.methodName(param1: Int, param2: Int): Int {
return 0
}
相比于定义一个普通的函数,定义扩展函数只需要在函数名前面加上一个ClassName.的语法结构就表示将该函数添加到指定类当中了。
3、例子:一段字符串中可能包含字母、数字和特殊符号等字符,实现统计字符串中字母的数量。
一般的写法:
// 单例类
object StringUtil{
fun lettersCount(str: String): Int{
var count = 0
for(char in str){
if(char.isLetter()) count++
}
return count
}
}
val str = "ABC123xyz!@#"
val count = StringUtil.lettersCount(str)
有了扩展函数之后可以将 lettersCount( ) 函数添加到 String 类中,先创建一个 String.kt 文件,添加下列代码,将 lettersCount( ) 方法定义成 String 类的扩展函数,那么函数中就自动拥有了 String 实例的上下文。因此 lettersCount( ) 函数就不再需要接收一个字符串参数了,而是直接遍历 this 即可,因为现在 this 就代表这字符串本身。
fun String.lettersCount(): Int{
var count = 0
for(char in this){
if(char.isLetter()){
count++
}
}
return count
}
val count = "ABC123xyz!@#".lettersCount()
String 是一个 final 类,任何一个类都不可以继承它。但在 Kotlin 中,可以向 String 类中扩展任何函数,使它的 API 变得丰富。比如,Kotlin 中的 String 还有 reverse( ) 函数用于反转字符串, capitalize( ) 函数用于对首字母进行大写等等。
运算符重载
Kotlin 允许将所有的运算符甚至其他关键字进行重载,从而拓展这些运算符和关键字的用法。Kotlin的运算符重载允许我们让任意两个对象进行运算。运算符重载的关键字是 operator,只要在指定函数前面加上 operator 关键字,就可以实现运算符重载的功能。
不同运算符对应的重载函数也是不同的,比如加号运算符对应的是 plus( ) 函数,减号运算符对应的是 minus( ) 函数。
例1:两个Money对象相加,Money对象直接和数字相加。
让 Money 主构造函数接收一个value参数,用于表示钱的金额,创建Money.kt。
class Money(val value: Int)
class Money(val value: Int){
// 使用运算符重载实现两个Money对象相加
operator fun plus(money: Money): Money{
val sum = value + money.value
return Money(sum)
}
// Kotlin允许对同一个运算符进行多重重载,可以实现Money对象直接和数字相加
operator fun plus(newValue: Int):Money{
val sum = value + newValue
return Money(sum)
}
}
val money1 = Money(5)
val money2 = Money(10)
val money3 = Money1 + Money2
println(money3.value)
val money4 = money3 + 20
println(money4.value)
例2:随机生成字符串长度的函数。
一般的写法:
fun getRandomLengthString(str: String): String{
val n = (1..20).random()
val builder = StringBuilder()
repeat(n){
builder.append(str)
}
return builder.toString()
}
这个函数的核心思想就是将传入的字符串重复n次,在Kotlin中可以使用 str * n 这种写法来表示让str 字符串重复n次。借助扩展函数功能向String 类中添加新函数。打开String.kt文件,然后加入如下代码:
operator fun String.times(n:Int):String{
val builder = StringBuilder()
repeat(n){
builder.append(this)
}
return builder.toString()
}
val str = "abc" * 3
println(str)
其实Kotlin 的 String类中已经提供了一个用于将字符串重复n遍的repeat( )函数,一次times( )函数还可以进一步精简。
operator fun String.times(n: Int) = repeat(n)
所以最终的实现代码:
fun getRandomLengthString(str: String) = str * (1..20).random()