- 提供架构的易用性
- 减少代码量,让代码更加整洁、纯粹
- 提高编码的效率,生产力提高
1.扩展方法
扩展方法的原型
fun String.lastChar(): Char = this.get(this.length-1)
2.扩展方法的使用
2.1在Kotlin中使用
fun main() {
Jump().test()
Jump().doubleJump()
}
class Jump{
fun test(){}
}
//扩展函数的定义,就是在方法的前面加上类前缀
//针对无法直接修改类的时候,如想要修改一个jar包种的类
fun Jump.doubleJump():String{
return "Jump.doubleJump()"
}
2.2 在Java中使用
public class KtExtensions {
public static void main(String[] args) {
KTExtensionsKt.doubleJump(new Jump());
}
}S
3.原理解析:Kotlin扩展函数是怎么实现的
AS中Tools
—> kotlin
----> show kotlin byteCode
public final class KTExtensionsKt {
public static final void main() {
(new Jump()).test();
doubleJump(new Jump());
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
@NotNull
public static final String doubleJump(@NotNull Jump $this$doubleJump) {
Intrinsics.checkNotNullParameter($this$doubleJump, "$this$doubleJump");
return "Jump.doubleJump()";
}
}
通过反编译出的java代码
当在java中调用kotlin扩展方法时需要传入一个所扩展类的实例对象
4.泛型扩展方法
fun <T> MutableList<T>.swap(index1:Int , index2: Int){
val temp = this[index1]
this[index1] = this[index2]
this[index2] = temp
}
主函数调用
val list = mutableListOf<Int>(1,2,3,4)
list.swap(3,1)
for(number in list){
print("$number ")
}
5.扩展属性
扩展属性提供了一种方法能通过属性语法进行访问的API来扩展。
尽管它们被叫做属性,但是它们不能拥有任何状态,它不能添加额外的字段到现有的Java对象实例
//5.扩展属性
//对String类添加一个lastChar属性 (在kotlin里任何字段都有get set方法)
val String.lastChar:Char get() = this.get(this.length - 1)
主函数调用
//5.扩展属性
val str = "evening"
val strLastChar = str.lastChar
println("\nlastChar: $strLastChar")
6.为伴生对象添加扩展
class Eat {
companion object {}
}
fun Eat.Companion.print(str: String) {
println("Eat.Companion"+str)
}
主函数调用
Eat.print("为伴生对象添加扩展")
7.Kotlin中常用的扩展
7.1 let扩展
let扩展函数的实际上是一个作用域函数,
- 当你需要去定义一个变量在一个特定的作用域范围内,那么let函数是一个不错的选择;
- let函数另一个作用就是可以避免写一些判断null的操作。
//7.1 let扩展 类名后面加上? 代表参数可能为空,使用的时候 注意判空
fun testLet(str: String?){
/* str.let {//it:String?
val str2 = "morning"
println(str2 + it)
}*/
//判空用法,当str为空时不会触发闭包里面的逻辑
str?.let{
val str2 = "morning"
println("$str2 $it")
}
}
主函数调用
//7.1 let扩展
testLet("ddd")
7.2 run扩展
run函数只接收一个lambda函数为参数,以闭包形式返回,返回值为最后一行的值或者指定的return的表达式,在run函数中可以直接访问实例的公有属性和方法
//7.2 run扩展
//在run函数中可以**直接访问实例的公有属性和方法**
fun testRun(jump: Jump) : String{
jump.run {
test() //jump.test()
return "run函数"
}
}
主函数调用
//7.2 run扩展
val j = Jump()
println(testRun(j))
7.3 apply扩展
apply函数的作用是:调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象。
从结构上来看apply函数和run函数很像,唯一不同点就是它们各自返回的值不一样 run函数是以闭包形式返回最后一行代码的值,而apply函数的返回的是传入对象的本身
//7.3 apply扩展
fun testApply() {
arrayListOf<String>().apply {
add("111")
add("22222")
}.let {
println(it)
}
}
主函数调用
//7.3 apply扩展
testApply()
案例:使用Kotlin扩展为控件绑定监听器减少模板代码
class MainActivity : AppCompatActivity() {
。
。
。
。
//绑定点击事件
R.id.nav_view.onClick(this){ //click函数
println("nav_view onClick")
}
}
}
//扩展函数 能够直接根据一个id为view绑定一个监听事件
fun Int.onClick(activity: Activity , click:()->Unit){
activity.findViewById<View>(this).setOnClickListener{
println("onClick")
click()
}
}