Kotlin标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数
- with:该函数接收两个参数,第一个参数是任意类型的对象;第二个参数是一个lambda表达式。
with函数会在lambda表达式中提供第一个函数的上下文,这样就很方便的可以调用第一个函数相关的API,并且以lambda表达式中最后一行代码。标准定义公式为:
val result = with(obj){
//这里是obg的上下文,可以直接调用obj相关的API
"value"//with函数的返回值
}
可能有点抽象,我举个例子,在JAVA中如果你想弄一个AlertDialog的话你得这么写:
AlertDialog.Builder builder = AlertDialog.Builder(this);
builder.setTitle("我是测试title");
builder.setMessage("我是测试message");
builder.setNegativeButton("取消", null);
builder.setPositiveButton("确定", null);
builder.show();
用现在的眼光看来,这个地方大量重复写了builder,很麻烦,使用了with函数之后你可以这么写:
val builder = with(AlertDialog.Builder(this)) {
setTitle("我是测试title")
setMessage("我是测试message")
setNegativeButton("取消", null)
setPositiveButton("确定", null)
this
}
builder.show()
可以看到,with函数中不用写builder就可以直接调用AlertDialog的相关API,很方便的避免了重复代码,并且最后一行直接通过this把AlertDialog.Builder(this)给返回了给了builder对象(第一个this是activity的上下文哦),然后builder就可以直接show了,上面两块代码最终执行结果是一毛一样的:
- run:和with有点相像,有一些语法变动,首先run函数是不能直接调用的,必须要通过某个对象调用run函数;其次run函数只接收一个lambda表达式作为参数,并且会在lambda表达式中提供该对象的上下文,也使用lambda表达式中最后一行代码作为返回值:
val result = obj.run{
//这里是obj的上下文
"value"//这是run方法的返回值
}
上面的代码是run函数的定义公式,继续拿刚才那个弹框的例子来说明,如果要用run函数来写的话,就是:
val builder = AlertDialog.Builder(this).run {
setTitle("我是测试title")
setMessage("我是测试message")
setNegativeButton("取消", null)
setPositiveButton("确定", null)
this
}
builder.show()
变换非常之小;
- apply:和run函数极其类似,都要在某个对象上调用,并且只接收一个lambda表达式作为参数并提供该对象的上下文,但是apply函数无法指定返回值,而是会自动返回该对象本身:
val result = obj.run{
//这里是obj的上下文
}
//代码走到这一行,这里的result == obj了
现在用apply函数来改一下上面的例子:
val builder = AlertDialog.Builder(this).apply {
setTitle("我是测试title")
setMessage("我是测试message")
setNegativeButton("取消", null)
setPositiveButton("确定", null)
}
builder.show()
由于apply函数返回的是对象本身,所以builder就是AlertDialog.builder的一个对象
肿么样是不是特简单捏?