kotlin作用域函数let, also, with, apply,run区别(kt面试必问)

Scope Functions:作用域函数,Scop是范围,作用域的意思;kotlin中用于简化代码
let作为五大作用域函数之一,在调用对象上执行代码块,并返回代码块最后一行结果,常跟it搭配使用,it指的是调用对象
例子

 val str = "a"
    val result = str.let {
        println("Length of the string is ${it.length}")
        it.uppercase()
        println(it)
        it.length+1
        it.length+10
    }
    println(result) // 输出:let中的最后一行结果

执行结果

Length of the string is 1
a
11

本例中虽然let代码块中执行了很多操作,但是 println(result) 只输出最后一行结果11
问题:
这个let感觉好奇怪,操作了那么多,只返回了最后一行结果,那操作那么多的意义是什么?来个实用场景看看呀

also作为五大作用域函数之二,在调用对象上执行代码块,并返回调用对象本身,常跟it搭配使用,it指的是调用对象

    val str = "a"
    val result = str.also {
        println("Length of the string is ${it.length}")
        it.uppercase()
        println(it)
        it.length+1
        it.length+10
    }
    println(result) // 输出:also 对象本身

输出

Length of the string is 1
a
a

also返回的是调用对象本身“a”

with作为五大作用域函数之三,把操作对象本身当参数传入,不需要显示的使用it,this,(可以用this,it用不了)就可以调用操作对象的属性和方法,返回代码块最后一行结果

    val str = "a"
    val result = with(str) {
        println("Length of the string is ${length}")
        uppercase()
        println(this)
        length+1
        length+10
    }

    println(result) // 输出:with中的最后一行结果
Length of the string is 1
a
11

apply作为五大作用域函数之四,可以对操作对象进行连续的操作,返回操作后的对象,可用this搭配,不可用it

    val strBuilder = StringBuilder()
    val resultApply = strBuilder.apply {
        append("Hello")
        append(" ")
        append("World")
    }
    println(resultApply.toString()) // 输出:Hello World
Hello World

run作为五大作用域函数之五,在调用对象上执行代码块,并返回代码块最后一行结果,可以跟this搭配,不可跟it

    val str = "a"
    val result = str.run {
        println("Length of the string is ${length}")
        uppercase()
        println(this)
        length+1
        length+10
    }

输出:

Length of the string is 1
a
11

在 Kotlin 中, let , also , with , apply 是四个常用的作用域函数,它们都用于在特定上下文中执行代码块,但各有特点和用途。以下是它们的区别:

  1. let
    作用:在调用对象上执行代码块,并返回代码块的最后一行结果。
    用法:

val result = someObject.let {
// it 指向 someObject
it.doSomething()
it.someProperty
}

特点:可以返回一个值,常用于对对象进行操作并返回结果。
02. also
作用:在调用对象上执行代码块,返回调用对象本身。
用法:

val result = someObject.also {
// it 指向 someObject
it.doSomething()
}

特点:返回对象本身,常用于对对象进行操作后继续使用该对象。
3. with
作用:在指定对象的作用域内执行代码块,返回代码块的最后一行结果。
用法:

val result = with(someObject) {
// this 指向 someObject
doSomething()
someProperty
}

特点:不需要显式使用 it 或 this ,常用于简化代码。
04. apply
作用:在调用对象上执行代码块,返回调用对象本身。
用法:

val result = someObject.apply {
// this 指向 someObject
doSomething()
}

特点:返回对象本身,常用于初始化对象或配置对象属性。
对比总结
返回值:
let 和 with 返回代码块的最后一行结果。
also 和 apply 返回调用对象本身。
上下文对象:
let 和 also 使用 it 引用对象。
with 和 apply 使用 this 引用对象( with 可以省略 this )。
用途:
let :常用于对对象进行操作并返回结果。
also :常用于对对象进行操作后继续使用该对象。
with :常用于简化代码,在特定对象的作用域内执行操作。
apply :常用于初始化对象或配置对象属性。
通过理解这些区别,可以根据具体需求选择合适的作用域函数来编写更简洁、易读的 Kotlin 代码。

小爱二次

在Kotlin编程语言中,这些词也有特定的含义和用法,以下是它们在Kotlin中的区别:

  1. let
    用法: let 是一个扩展函数,用于在某个对象上执行操作,并返回结果。
    示例:

val result = “Hello”.let {
it.length
}
// result 的值为 5

解析: let 函数接收一个lambda表达式, it 代表当前对象(这里是字符串"Hello"),返回lambda表达式的结果。
2. also
用法: also 是一个扩展函数,用于在某个对象上执行操作,但返回对象本身。
示例:

val message = “Hello”.also {
println(it)
}
// 输出 “Hello”,message 的值为 “Hello”

解析: also 函数接收一个lambda表达式, it 代表当前对象,执行操作后返回对象本身。
3. with
用法: with 是一个内联函数,用于在某个对象上执行一系列操作,返回最后一个表达式的结果。
示例:

val length = with(“Hello”) {
length
}
// length 的值为 5

解析: with 函数接收一个对象和一个lambda表达式,lambda表达式内的操作都在该对象上下文中执行,返回最后一个表达式的结果。
特点:不需要显式使用 it 或 this ,常用于简化代码。
4. apply
用法: apply 是一个扩展函数,用于在某个对象上执行一系列操作,返回对象本身。
示例:

val message = StringBuilder().apply {
append(“Hello”)
append(" World")
}
// message 的值为 “Hello World”

解析: apply 函数接收一个lambda表达式, this 代表当前对象,执行操作后返回对象本身。
5. run
用法: run 可以作为扩展函数或内联函数使用,用于在某个对象上执行操作,返回结果。
示例:

val length = “Hello”.run {
length
}
// length 的值为 5

解析:作为扩展函数时, run 接收一个lambda表达式, this 代表当前对象,返回lambda表达式的结果。

总结:
let 和 run 都返回lambda表达式的结果,但 let 使用 it 引用对象, run 使用 this 。
also 和 apply 都返回对象本身,但 also 使用 it 引用对象, apply 使用 this 。
with 是内联函数,返回lambda表达式的最后一个结果。
希望这些解释能帮助你更好地理解这些函数在Kotlin中的用法!如果有更多问题,欢迎继续提问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值