大学 建网站,如何做微信小程序店铺,小程序制作报价单,平面设计师求职网1 类的扩展 Kotlin 提供了扩展类或接口的操作#xff0c;而无需通过类继承或使用装饰器等设计模式#xff0c;来为某个类添加一些额外的属性或函数#xff0c;我们只需要通过一个被称为扩展的特殊声明来完成。通过这种机制#xff0c;我们可以将那些第三方类不具备的功能强…1 类的扩展 Kotlin 提供了扩展类或接口的操作而无需通过类继承或使用装饰器等设计模式来为某个类添加一些额外的属性或函数我们只需要通过一个被称为扩展的特殊声明来完成。通过这种机制我们可以将那些第三方类不具备的功能强行进行扩展方便我们的操作。
1.1 扩展内置类
1.1.1 扩展属性
fun main() {var str abcstr.property 5 // 打印: set property, value5var property str.property // 打印: get propertyprintln(property) // 打印: 10
}var String.property: Intset(value) {println(set property, value$value)}get() {println(get property)return 10} 说明扩展属性并不是真的往类中添加属性也不会真的插入一个成员字段到类的定义中导致没有变量存储我们的数据我们只能明确定义一个 getter 和 setter 来创建扩展属性才能让它使用起来真的像是类的属性一样。 如下如果没有定义 getter 和 setter方法将会报错如下。 1.1.2 扩展函数
fun main() {var str abcstr.myFun(xxx) // 打印: myFun, thisabc, valuexxx
}fun String.myFun(value: String) {println(myFun, this$this, value$value)
}
1.2 扩展自定义类
1.2.1 扩展属性 1扩展新属性
fun main() {var stu Student()stu.name Mary // 打印: set name, valueMaryvar name stu.name // 打印: get nameprintln(name) // 打印: Tom
}class Studentvar Student.name: Stringset(value) {println(set name, value$value)}get() {println(get name)return Tom} 2扩展旧属性
fun main() {var stu Student(Jack)stu.name Mary // 无打印var name stu.name // 无打印println(name) // 打印: Mary
}class Student(var name: String)var Student.name: String // 扩展属性不会生效set(value) {println(set name, value$value)}get() {println(get name)return Tom} 说明如果扩展类中的同名同类型属性扩展将不会生效。
1.2.2 扩展函数 1扩展新函数
fun main() {var stu Student(Mary)stu.test() // 打印: test, nameMary
}class Student(var name: String)fun Student.test() {println(test, name$name)
} 2扩展旧函数
fun main() {var stu Student(Mary)stu.test() // 打印: inner, nameMary
}class Student(var name: String) {fun test() {println(inner, name$name)}
}fun Student.test() { // 扩展函数不会生效println(extended, name$name)
} 说明如果扩展类中的同名同参函数扩展将不会生效。
1.3 重写父类的扩展函数 类的扩展是静态的实际上并不会修改它们原本的类也不会将新成员插入到类中仅仅是将我们定义的功能变得可调用使用起来就像真的有一样。同时在编译时也会明确具体调用的扩展函数。
1.3.1 扩展属性
fun main() {var stu: Student Student()var name1 stu.name // 打印: Student, get nameprintln(name1) // 打印: Maryvar peo: People stuvar name2 peo.name // 打印: People, get nameprintln(name2) // 打印: Tom
}open class People
class Student: People()var People.name: Stringset(value) {println(People, set name, value$value)}get() {println(People, get name)return Tom}var Student.name: Stringset(value) {println(Student, set name, value$value)}get() {println(Student, get name)return Mary}
1.3.2 扩展函数
fun main() {var stu: Student Student()println(stu.type()) // 打印: Studentvar peo: People stuprintln(peo.type()) // 打印: People
}open class People
class Student: People()fun People.type() People
fun Student.type() Student
1.4 匿名扩展函数 匿名函数的使用详见 →【Kotlin】函数。
fun main() {var myFun: String.() - Int fun String.(): Int {return this.length}println(abc.myFun()) // 打印: 3
} 可以使用 Lambda 表达式简化如下Lambda 表达式的使用详见 → 【Kotlin】Lambda表达式。
fun main() {var myFun: String.() - Int {this.length}println(abc.myFun()) // 打印: 3
}
1.5 扩展函数作为参数
fun main() {var len abc.len { this.length }println(len) // 打印: 3
}fun String.len(func: String.() - Int): Int {return func()
}
2 官方扩展函数
2.1 源码 Kotlin 提供了一些泛型扩展函数在 Standard.kt 中如apply、also、run、let、takeIf、takeUnless 等。 apply、also、run、let 的区别如下作用是执行 block 函数的内容并且返回 T 或 block 的返回值通常用于判空处理。
函数block是否为扩展函数block入参block返回值函数返回值访问 T 对象apply是无无Tthisalso否T无Titrun是无RRthislet否TRRit
2.1.1 apply
public inline fun T T.apply(block: T.() - Unit): T {...block()return this
}
2.1.2 also
public inline fun T T.also(block: (T) - Unit): T {...block(this)return this
} 2.1.3 run
public inline fun T, R T.run(block: T.() - R): R {...return block()
}
2.1.4 let
public inline fun T, R T.let(block: (T) - R): R {...return block(this)
}
2.1.5 takeIf
public inline fun T T.takeIf(predicate: (T) - Boolean): T? {...return if (predicate(this)) this else null
}
2.1.6 takeUnless
public inline fun T T.takeUnless(predicate: (T) - Boolean): T? {...return if (!predicate(this)) this else null
}
2.1.7 with
public inline fun T, R with(receiver: T, block: T.() - R): R {...return receiver.block()
} 说明with 不是扩展函数但入参 block 是扩展函数。
2.2 应用
2.2.1 apply 应用
fun main() {var stu Student()test(stu)
}fun test(stu: Student?) {stu?.apply {this.name Tomthis.age 23}println(stu) // 打印: [Tom, 23]
}class Student {var name: String? nullvar age: Int 0override fun toString(): String {return [$name, $age]}
} 说明also、run、let 的应用与 apply 类似。
2.2.2 takeIf 应用
fun main() {var str ABCvar str2 str.takeIf { it.length % 2 1 }?.let { it it.reversed().substring(1) }println(str2) // 打印: ABCBA
}
2.2.3 with 应用
fun main() {var str ABCvar len with(str) { this.length }println(len) // 打印: 3
}