kotlin总结

kotlin知识点记录整理


空安全

a?.foo()相当于java:
if(a!=null){
a.foo();
}

当定义一个xxx?变量,后续使用的时候,要么显式的去判空,要么加上?

a!!.foo()相当于java:
if(a!=null){
a.foo();
}else{
throw new KotlinNullPointException();
}

Kotlin 的 val 和 Java 的 final 有什么区别?

1.都不可以被再次赋值
2.在Kotlin中函数的参数默认就是 val 的,在方法中不可以再修改这个参数
而 Java 中必须要加上 final(形参上),才能有这个效果。

let with run apply also

1.返回最后一行 / return
let it
with this
run this

2.返回对象本身
apply this
also it

其中this均可省略

类委托

2个对象参与处理同一请求,这个请求就是我们约束类的逻辑,因此委托类(DelegateGamePlayer)和被委托类(RealGamePlayer)都需要实现我们的约束接口IGamePlayer。(具体参考记事本)

A委托B,B是被委托者,真正的逻辑执行者

属性委托

可以使用 ReadOnlyProperty / ReadWriteProperty 接口实现

lateinit lazy()

lateinit 只用于 var,而 lazy 只用于 val

lazy:当且仅当变量被第一次调用的时候,委托方法才会执行。

在定义变量A时,加上 by lazy 操作符,当A变量第一次使用时会执行 lambda 方法块里的代码为变量初始化值,再次使用 A 变量时,则会使用上一次赋的值。

比如:val A by lazy { view!!.findViewById(R.id.A) }

lateinit var只是让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化还需要开发者自己决定。
而by lazy真正做到了声明的同时也指定了延迟初始化时的行为,在属性被第一次被使用的时候能自动初始化

理解T.()->Unit 、 ()->Unit与(T) -> Unit

T.()->Unit
T.()->Unit 等同于为T定义了一个扩展函数,所以在函数体内可以直接通过this或省略来访问T代表的对象

()->Unit / (T) -> Unit
(T) -> Unit与 ()->Unit只是一个普通的函数

泛型函数

fun a(b : T):T{
……
}

函数式接口(SAM)

只有一个抽象方法的接口称为函数式接口或 SAM(单一抽象方法)接口

fun interface a{
fun b()
}

在使用时,可以简化
比如:val c = a{ 内部处理逻辑 }

init{ }

执行时间:
主构造函数 > init块 > 次构造函数

https://juejin.cn/post/6844903872016678919

object 关键字

1.对象声明(object declaration)
类似单例 singleton

2.伴生对象(companion object)
类似 java class 中的静态属性及方法

3.对象表达式(object expression)
对象表达式常用来作为匿名内部类的实现
private val callBack = object : CallBack {
override fun onSuccess() {}
override fun onFailure() {}
}

// 通过对象表达式实现点击事件回调
btn.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View) {
TODO(“Not yet implemented”)
}
})