kotlin学习笔记——内联函数

Kotlin学习笔记系列:http://blog.csdn.net/column/details/16696.html

在Kotlin中,使用inline修饰符标记内联函数。
与普通函数不同,内联函数在编译时被替换掉,不是真正的函数调用。
如kotlin提供的with函数,如下:
@kotlin.internal.InlineOnly
public inline fun  with(receiver: T, block: T.() -> R): R = receiver.block()
接收一个对象receiver和一个函数block,函数体是用这个对象来执行函数receiver.block(),相当于对receiver扩展了block函数。
注意:“T.() -> R”表示这个传入的函数是对T的扩展函数,所以在函数体中才可以receiver.block()。如果改成“() -> R”则receiver.block()会报错,直接使用block()才行。

通过内联函数可以简化代码,如:
inline fun supportLollipop(code: () -> Unit){
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
          code()
     }
}
这样当我们想在高版本执行代码时,直接使用这个函数即可,如:
supportLollipop{
     ...
}


1、with函数
with函数接收一个对象和一个扩展函数,作用是在这个对象上扩展这个函数,这样在函数中可以以this的形式使用该对象。在对一个对象做很多操作时,使用with可以简化代码,如:
with(person1){
     nameView.text = name
     ageView.text = age.toString()
     detailView.text = "name:$name, age:$age"
}
就可以不用写类似person1.name之类的代码了。


2、let函数
let函数很简单,接收一个函数作为参数,将函数的返回值作为let函数的返回值。在处理可null对象是很有用。
inline fun  T.let(f: (T) -> R): R = f(this)
使用了两个泛型,T是调用者类型,同时也是接收函数所接收的参数类型;R是返回值类型。
如何使用呢,假设有这样的代码:
val obj = if(item != null) manager.transfor(item) else null
使用let函数就可以简化为
val obj = item?.let( manager.transfor(it) )
因为有"?."操作符,只有当item不为null的时候才会执行代码,所以为null的时候直接返回null给obj。(注意执行transfor时item已经是非null了,所以transfor可以接受非null参数)


3、apply函数
apply函数与with函数很相似,不同处是apply函数会在执行接收的函数后返回this。
inline fun  T.apply(f: T.() -> Unit): T { f(); return this }
apply函数可以使我们避免创建builder,如:
val textView = TextView(context).apply{
     text = "hello"
     hint = "hint"
     textColor = android.R.color.white
}
当然我们也可以使用with,如:
val textView = with( TextView(context) ){
     ...
     this
}
最后要手动返回this,所以这种情况下使用apply会更加方便一些。( 注意with是没有调用者的

你可能感兴趣的:(Kotlin,Kotlin学习笔记)