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学习笔记——内联函数)