上一篇:Kotlin一步一步学(三) -- 延迟初始化和密封类
扩展函数
扩展函数表示即使在不修改某个类源码的前提下,仍可以打开这个类,向该类添加新的函数。现代很多编程语言都实现了扩展函数,可Java却一直没有实现这个实用的功能。值得高兴的是,Kotlin早早就对扩展函数进行了很好的支持。
案例:一段随机字符串中包含字母、数字和特殊字符等,简单统计一下字符串中有很多个字母。
普通编码写法
定义一个工具类,然后使用for-in循环去遍历字符串中的每一个字符。如果该字符是字母的话,那就将计数器加1,最终返回计数器的值。代码如下所示
object StringUtil {
fun lettersCount(str: String): Int {
var count = 0
for (char in str) { //循环遍历
if (char.isLetter()) {
count++;
}
}
return count
}
}
//调用方式
val str = "1234abcd@#$"
val count = StringUtil.lettersCount(str)
扩展函数简化写法
有了扩展函数后,我们可以用一种更加面向对象的思维来实现这个功能,比如说将lettersCount()函数添加到String类中。定义扩展函数非常简单,只需要在函数名前面加一个ClassName.的语法结构,就表示将该函数添加到指定类当中了。优化代码如下所示
fun String.lettersCount(): Int {
var count = 0
for (char in this) { //循环遍历
if (char.isLetter()) {
count++;
}
}
return count
}
//调用方式
val count = "1234abcd@#$".lettersCount()
是不是很神奇,就像是String类中自带了lettersCount()方法一样,这样用起来简直爽爆了。
运算符重载operator
运算符重载是Kotlin提供的一个有趣的语法糖。Java中内置了许多的运算符关键字,如+ - * / % 等等。现在Kotlin允许我们将所有的运算符进行重载,从而拓展这些运算符和关键字的用法。
运算符重载使用的是operator
关键字,只要在指定函数的前面加上operator
关键字,就可以实现运算符重载的功能。
案例:定义一个Money类,让Money的主构造函数接收一个value参数,用于表示钱的金额。我们要实现的功能是让两个Money对象相加。代码如下所示
class Money(val value: Int) {
operator fun plus(money: Money): Money {
val sum = value + money.value //将当前Money对象的value和传入的value值进行相加
return Money(sum) //将得到的和传给一个新的Money对象并将其返回。这样两个Money就相加了。
}
}
val money1 = Money(1)
val money2 = Money(2)
val money3 = money1+money2
println(money3.value) //输出值为3
是不是很神奇,这样就实现了Money的相加,通过重载运算符“+”来实现。
Kotlin允许我们重载的运算符和关键字多达十几个。下面我列出常用的可重载运算符对应的语法糖表达式,以及它们会被转换成的实际调用函数。
语法糖表达式 | 实际调用函数 |
---|---|
a + b | a.plus(b) |
a - b | a.minus(b) |
a * b | a.times(b) |
a / b | a.div(b) |
a % b | a.rem(b)、 a.mod(b) (已弃用) |
a++ | a.inc() |
a-- | a.dec() |
+a | a.unaryPlus |
-a | a.unaryMinus |
!a | a.not() |
a == b | a.equals(b)=0 |
a > b | a.equals(b) > 0 |
a < b | a.equals(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |
a..b | a.rangeTo(b) |