kotlin 系列

1. lambda简化

1.1 接口回调多于1个,使用object关键字

view.setEventListener(object:listener(){
        fun onSuccess(data:String){
            //TODO
        }

        fun onFailure(e:Exception){
            //TODO
        }
    }
)

1.2 接口回调只有一个

view.setEventListener({
            data ->
        }
)   
//省略参数
view.setEventListener({
    }
)

//最后一个参数是函数
view.setEventListener(){
}

//只有一个参数且是函数
view.setEventListener{
}

2. let 扩展函数

object?.let{
        it.xxx
    }

inline fun  T.let(block:(T) -> R) : R = block(T)

activity?.showText()
activity?.showDialog()

activity?.let{
    showText()
    showDialog()
}

3.with 扩展函数

with(usr){
    }

inline fun<T, R> with(receiver: T, block: T.() -> R) : R = receiver.block()

holder.tvName.text = data.name
holder.tvContent.text = data.content

var data = getItem(position)?: return
with(data){
    holder.tvName.text = name
    holder.tvContent.text = content
}

4.run 扩展函数

incline  T.run(block: T.() -> R) : R = block()

getItem(position).run{
    holder.tvName.text = name
    holder.tvContent.text = content
}

5.apply 扩展函数

incline  T.apply(block: T.() -> Unit) : T = {block(), return this}

data?.apply{
    view.text = this.name
}?.child?.apply{

}

6.also 扩展函数

incline  T.alos(block: (T) -> Unit) : T = {block(this), return this}

7.by lazy

lazy 应用于单例模式(if null then init else return),而且当且仅当变量第一次
被调用的时候,委托方法才会执行
val manager: UserManager by lazy = {UserManager.getInstance()}

8.函数形式

fun sum(a: Int, b: Int) : Int = a + b
fun sum(a: Int, b: Int) = a + b
fun sum(a: Int, b: Int) = {
    return a + b
}
fun sum(a: Int) : Unit{}
fun sum(a: Int): {}
var sum : (Int, Int) -> Int = {a, b -> a + b}

9.get、set

kotlin 对于var成员变量自动生成get/set方法,val自动生成get方法,如何避免自动产生方法过多

9.1 const修饰val

const val PACKAGENAME = "xxx"

9.2 @JvmField注解

@JvmField var name: String = ""

9.3 get、set方法重写,避免死循环

var name: String? = null
get() = field
set(value){
    field = value
}
//注意 field 不能写成name,否则死循环

你可能感兴趣的:(kotlin,高阶,语言学习)