Kotlin笔记15-扩展函数和运算符重载
9.1 延迟初始化和密封类
- 扩展函数
如何对一个字符串计数
Example:
object StringUtil{
fun letterCount(str:String):Int{
var count=0
for(char in str){
if(char.isLetter()){
count++
}
}
return count
}
}
fun main() {
val str="ABC123xyz!@#"
val count=StringUtil.letterCount(str)
}
语法 | 特性 |
Java | 如上Java编程中最标准的实现思维 |
Kotlin | 使用一种更加面向对象的思维实现-将方法添加到现有类中(扩展函数) |
定义扩展函数的语法结构:
fun ClassName.method(param1: Int, param2: Int): Int {
return 0
}
优化:
fun String.letterCount(): Int {
var count = 0
for (char in this) {
if (char.isLetter())
count++
}
return count
}
用法:
val count1="ABC123xyz!@#".letterCount()
序号 | Tips |
1 | 建议向哪个类添加扩展函数,即创建一个同名文件:便于查找,以及顶层方法的特性,使他拥有全局的访问域 |
2 | Kotlin的扩展函数可以使一个final类扩展任何函数,使其API变得丰富 |
3 | 扩展函数可以大幅提升代码质量和开发效率 |
reverse(): 反串字符串函数(String)
capitalize(): 首字母大写函数(String)
- 运算符重载
语言 | 特性 |
Java | + - * / % ++ – |
Kotlin | 允许我们将所有的运算符,关键字进行重载,扩展他们的用法 |
operator
+:plus(), -:minus()
Example:
class Obj {
operator fun plus(obj: Obj): Obj {
//处理相加的逻辑
}
}
val obj1 = Obj()
val obj2 = Obj()
val obj3 = obj1 + obj2 /-> obj1.plus(obj2)
让两个Menoy相加:
class Money(val value: Int) {
operator fun plus(money: Money): Money {
val sum = value + money.value
return Money(sum)
}
}
用法:
fun main() {
val money1=Money(5)
val money2=Money(10)
val money3=money1+money2
println(money3.value)
}
结果:
运算符多重重载
class Money(val value: Int) {
operator fun plus(money: Money): Money {
val sum = value + money.value
return Money(sum)
}
operator fun plus(newValue: Int): Money {
val sum = value + newValue
return Money(sum)
}
}
fun main() {
val money1 = Money(5)
val money2 = Money(10)
val money3 = money1 + money2
val money4 = money3 + 20
println(money3.value)
println(money4.value)
}
结果:
语法糖表达式和实际调用函数对照表
语法糖表达式 | 实际调用函数 |
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 ++ | a.inc() |
a – | a.dec() |
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
a == b | a.equals(b) |
a > b | |
a < b | |
a >= b | a.compareTo(b) |
a <= b | |
a…b | a.rangeTo(b) |
a[b] | a.get(b) |
a[b] = c | a.set(b,c) |
a in b | b.contains(a) |
小试牛刀-随机长度字符串生成
Example:
fun getRandomLengthString(str: String): String{
val n = (1..20).random()
val builder= StringBuilder()
repeat(n){
builder.append(str)
}
return builder.toString()
}
str*n:
operator fun String.times(n:Int):String{
val builder=StringBuilder()
repeat(n){
builder.append(this)
}
return builder.toString()
}
用法:
fun main() {
val str = "str" * 3
println(str)
}
结果:
那么,还可不可以再优化了呢
repeat(): String类中将字符串重复n遍的函数
operator fun String.times(n:Int)= repeat(n)
fun getRandomLength(str: String) = str*(1..20).random()