Kontakt标准函数(with、run、apply)

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的一个对象

肿么样是不是特简单捏?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值