kotlin标准函数let、also、with、run、apply

946 阅读4分钟

Kotlin的标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以自由的调用所有的标准函数,可以大大提高开发者的开发效率。下面主要讲解:

let函数

also函数

with函数

run函数

apply函数

1.let函数

1.1简介

let既不是操作符也不是什么关键字,而是一个函数。这个函数提供了函数式API的编程接口,并将原始调用对象作为参数传递到Lambda表达式中。let函数属于kotlin中的标准函数。

obj.let{obj2->
//编写具体的业务逻辑
}

obj对象本身可以作为参数传递到Lambda表达式中,不过,为了防止变量重名,这里将参数名改成了obj2,但实际上它们是同一个对象。

1.2 使用方法

// 作用1:使用it替代object对象去访问其公有的属性 & 方法

object.let{
  it.todo()
}

// 作用2:判断object为null的操作

object?.let{//表示object不为null的条件下,才会去执行let函数体
  it.todo()
}

1.3 使用示例

// 使用Java

if( mVar != null ){
    mVar.function1();

    mVar.function2();

    mVar.function3();
}

// 使用kotlin(无使用let函数,每次调用mVar都要进行一次if判断)

mVar?.function1()
mVar?.function2()
mVar?.function3()

// 使用kotlin(使用let函数)

let函数会将study对象本身作为参数传递到Lambda表达式中,此时的study对象肯定不为空了,我们就能放心的调用study的任意方法。

mVar?.let {
  mVar.function1()
  mVar.function2()
  mVar.function3()
}

由于Lambda表达式的语法特性,当Lambda表达式中的参数列表中只有一个参数时可以不用声明参数名直接使用it关键字来代替

mVar?.let {
  it.function1()
  it.function2()
  it.function3()
}

let函数可以处理全局变量的判空问题,而if语句无法做到。

var study:Study?=null
fun doStudy(){
   if(study!=null){
       study.readBooks()
       study.doHomework()
    }
}

运行时可能会报错,是因为全局变量的值随时都有可能被其他线程所修改,即使做了判空处理仍无法保证if语句中的study变量没有空指针风险。但用let仍能正常工作。

2. also函数

2.1 作用 & 应用场景

类似let函数,但区别在于返回值:

let函数:返回值 = 最后一行 / return的表达式

also函数:返回值 = 传入的对象的本身

2.2 使用示例

// let函数

var result = mVar.let {
     it.function1()

     it.function2()

     it.function3()

     999
}

// 最终结果 = 返回999给变量result

// also函数

var result = mVar.also {

      it.function1()

      it.function2()

      it.function3()

      999

}

// 最终结果 = 返回一个mVar对象给变量result

3. with函数

3.1 作用

调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可

3.2 应用场景

需要调用同一个对象的多个方法 / 属性

3.3 使用方法

with(object){
  // ...
}

// 返回值 = 函数块的最后一行 / return表达式

3.4 使用示例

// 此处要调用people的name 和 age属性

// kotlin

val people = People("carson", 25)

with(people) {

println("my name is $name, I am $age years old")

}

// Java

User peole = new People("carson", 25);

String var1 = "my name is " + peole.name + ", I am " + peole.age + " years old";

System.out.println(var1);

4. run函数

4.1 作用 & 应用场景

结合了let、with两个函数的作用,即:

调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可

定义一个变量在特定作用域内

统一做判空处理

4.2 使用方法

object.run{

// ...

}

// 返回值 = 函数块的最后一行 / return表达式

4.3 使用示例

// 此处要调用people的name 和 age属性,且要判空

// kotlin

val people = People("carson", 25)

people?.run{

    println("my name is $name, I am $age years old")

}

// Java

User peole = new People("carson", 25);

String var1 = "my name is " + peole.name + ", I am " + peole.age + " years old";

System.out.println(var1);

5. apply函数

5.1 作用 & 应用场景

与run函数类似,但区别在于返回值:

run函数返回最后一行的值 / 表达式

apply函数返回传入的对象的本身

5.2 应用场景

对象实例初始化时需要对对象中的属性进行赋值 & 返回该对象

5.3 使用示例

// run函数

val people = People("carson", 25)

val result = people?.run{

    println("my name is $name, I am $age years old")

    999

}

// 最终结果 = 返回999给变量result

// Java

val people = People("carson", 25)
val result = people?.run{
    println("my name is $name, I am $age years old")
    999
}

// 最终结果 = 返回一个people对象给变量result

总结:

多种库函数在选用时候的标准