Kotlin用法摘记

133 阅读2分钟

这是我参与更文挑战的第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参数闭包返回返回值函数返回值其它
letfun <T, R> T.let(f: (T) -> R): RitAny闭包返回
alsofun T.also(block: (T) -> Unit): TitUnitthis
applyfun T.apply(f: T.() -> Unit): T无,可以使用thisUnitthis
withfun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()无,可以使用thisAny闭包返回
run run(block: () -> R): RAny闭包返回
repeatfun repeat(times: Int, action: (Int) -> Unit)UnitUnit
takeIF
takeUnless

待补充

by委托

invoke

列表操作

定义静态方法

sealed class

枚举

协变和逆变