上一篇讲了with,感兴趣的同学可以去了解,链接放下面了:

kotlin 之几个常见的内联函数(二)_水很清的博客-CSDN博客

这篇继续内联函数内容,轮到了run了。话不多说,开始。

run函数

 一、函数结构为

public inline fun <T, R> T.run(block: T.() -> R): R = block()
  • R 是返回类型
  • T 是输入类型或者调用对象的类型

它表示T类型在调用with后将变为R类型。

二、一般使用结构:

object.run{
//todo
}

与let 类似

三、run 函数底层的inline扩展函数+lambda结构

@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R = block()

四、函数结构分析

run函数实际上可以说是let和with两个函数的结合体,run函数只接收一个lambda函数为参数,以闭包形式返回,返回值为最后一行的值或者指定的return的表达式。

五、举个栗子

val user = User("Kotlin", 1, "1111111")
    val result = user.run {
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
    }

可以看到run的使用方式跟let一样,函数体里面的使用方法却又跟with一样,直接调用属性名,无需对象+属性名,函数的返回值是最后一行代码,即result=1000

六、kotlin 与 java的代码对比

//kotlin
fun main(args: Array<String>) {
    val user = User("Kotlin", 1, "1111111")
    val result = user.run {
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
    }
    println("result: $result")
}
 
//java
  public static final void main(@NotNull String[] args) {
      Intrinsics.checkParameterIsNotNull(args, "args");
      User user = new User("Kotlin", 1, "1111111");
      String var5 = "my name is " + user.getName() + ", I am " + user.getAge() + " years old, my phone number is " + user.getPhoneNum();
      System.out.println(var5);
      int result = 1000;
      String var3 = "result: " + result;
      System.out.println(var3);
   }

七、使用场景

适用于let,with函数任何场景。因为run函数是let,with两个函数结合体,准确来说它弥补了let函数在函数体内必须使用it参数替代对象,在run函数中可以像with函数一样可以省略,直接访问实例的公有属性和方法,另一方面它弥补了with函数传入对象判空问题,在run函数中可以像let函数一样做判空处理

下面是个栗子:with 与 run 的对比,可以看到run比with多了判空操作。

//with
override fun onBindViewHolder(holder: ViewHolder, position: Int){
   val item = getItem(position)?: return
   with(item){
      holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
       holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
       holder.tvExtraInf = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews"
       ...   
   }
}

//run
override fun onBindViewHolder(holder: ViewHolder, position: Int){
  getItem(position)?.run{
      holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
       holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
       holder.tvExtraInf = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews"
       ...   
   }
}

以上就是run 的作用及使用场景,下一篇讲解apply,that's all

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐