这是我参与更文挑战的第7天,活动详情查看: 更文挑战
记录Kotlin在项目中的用法,持续更新...
函数作为入参
1:函数作为入参的写法:block:()->Unit
如果函数的最后一个参数是函数,则可以在圆括号外传递lambda表达式来实现
定义:
fun testFun(param:String,block:()->Unit) {
}
调用:
testFun("1",{})
testFun("1"){}
这两种调用方法都可以,因为函数最后一个参数是函数,所有可以可以在圆括号外传递lambda表达式来实现
2:函数作为参数替代接口回调
java里面如果要实现回调,需要通过接口的方式来实现,那kotlin里面可以直接传递函数进行实现,省掉接口的定义
class A {
init {
B().setCallBack {
//B类里面触发Click时,会回调到这里
}
}
}
class B {
var mBlock: () -> Unit = {}
fun click() {
this.mBlock()
}
fun setCallBack(block: () -> Unit) {
this.mBlock = block
}
}
扩展函数T.()->Unit
扩展函数是可以在不改变原有类结构的基础上,给类新增方法,在新增的方法里,可以获取到该类的this对象
class A{
var num = 0;
}
fun A.test() { //给A类扩展了一个test方法
println(this.num) //这个函数里可以获取到A类的this对象
}
理解T.()->Unit 、 ()->Unit与(T) -> Unit
T.()->Unit 是扩展函数
()->Unit 普通函数定义
(T) -> Unit,入参为泛型的函数
reified关键字
reified需要结合inline一起使用,被reified修饰的泛型,我们可以从其中获取到Class对象,看个示例比较好理解
//这种方式我们可以正常启动Activity
inline fun <reified T:Activity> start(context: Context) {
context.startActivity(Intent(context,T::class.java))
}
//这种方式会报错,T的类型获取不到
fun <T:Activity> start(context: Context){
context.startActivity(Intent(context,T::class.java))
}
reified结合扩展函数,我们可以得到更优雅的封装
inline fun <reified T:Activity> Context.startActivity() {
startActivity(Intent(this,T::class.java))
}
let、with、run、apply、also
| 函数名 | 定义 | block参数 | 闭包返回返回值 | 函数返回值 | 其它 |
|---|---|---|---|---|---|
| let | fun <T, R> T.let(f: (T) -> R): R | it | Any | 闭包返回 | |
| also | fun T.also(block: (T) -> Unit): T | it | Unit | this | |
| apply | fun T.apply(f: T.() -> Unit): T | 无,可以使用this | Unit | this | |
| with | fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f() | 无,可以使用this | Any | 闭包返回 | |
| run | run(block: () -> R): R | 无 | Any | 闭包返回 | |
| repeat | fun repeat(times: Int, action: (Int) -> Unit) | 无 | Unit | Unit | |
| takeIF | |||||
| takeUnless |
待补充