MST
星途 面试题库

面试题:Kotlin中let、run、apply作用域函数的区别与应用场景

请阐述Kotlin中let、run、apply这三个作用域函数在语法、返回值以及通常适用场景上有哪些不同?并分别举例说明如何使用它们对一个自定义的JavaBean对象进行属性设置和结果处理。
15.4万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

1. 语法区别

  • let:调用者作为 it 参数传递给 let 块,语法为 obj.let { /* 代码块 */ }
  • run:有两种形式,一种类似 let,调用者作为 it 参数,obj.run { /* 代码块 */ };另一种是作为扩展函数直接在对象上调用,obj.run { /* 代码块 */ },这种形式下 this 指向调用者。
  • apply:调用者作为 thisapply 块内可用,语法为 obj.apply { /* 代码块 */ }

2. 返回值区别

  • let:返回 let 块内最后一行代码的结果。
  • run:同 let,返回 run 块内最后一行代码的结果。
  • apply:返回调用者对象本身。

3. 适用场景区别

  • let:常用于需要对一个可空对象进行操作,并处理操作结果的场景,且希望返回处理后的结果。
  • run:既可以用于处理可空对象,也可用于在对象上执行一系列操作并返回结果,当需要对对象做一些配置并返回配置结果时很有用。
  • apply:主要用于对对象进行一系列属性设置操作,返回设置好属性后的对象本身。

4. 自定义JavaBean示例

假设我们有一个JavaBean类:

public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在Kotlin中使用这三个函数:

  • let示例
val user = User()
val result = user.let {
    it.name = "John"
    it.age = 30
    it.name.length
}
println(result) // 输出 4
  • run示例
val user = User()
val result = user.run {
    name = "Jane"
    age = 25
    name.length
}
println(result) // 输出 4
  • apply示例
val user = User().apply {
    name = "Bob"
    age = 28
}
println(user.name) // 输出 Bob