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)
}

​结果:​​​【kotlin】Kotlin笔记15-扩展函数和运算符重载(operator)_字符串
运算符多重重载

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)
}

​结果:​​​【kotlin】Kotlin笔记15-扩展函数和运算符重载(operator)_java_02
语法糖表达式和实际调用函数对照表

语法糖表达式

实际调用函数

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)
}

​结果:​​​【kotlin】Kotlin笔记15-扩展函数和运算符重载(operator)_字符串_03
​那么,还可不可以再优化了呢​

repeat(): String类中将字符串重复n遍的函数

operator fun String.times(n:Int)= repeat(n)

fun getRandomLength(str: String) = str*(1..20).random()