Android面试题之Kotlin的apply、let、also、run函数

本文首发于公众号"AntDream",欢迎微信搜索"AntDream"或扫描文章底部二维码关注,和我一起每天进步一点点

apply

apply函数可以看作是一个配置函数,可以传入一个接收者,然后调用一系列函数来配置以便使用,如果提供lambda给apply函数执行,将返回配置好的接收者

apply能让每个配置函数都作用于接收者

scss 复制代码
val file1 = File("C://Android").apply {
    setExecutable(false)
    setReadable(true)
    setWritable(true)
}

let

能使某个变量作用于其Lambda表达式里,让it关键字能引用它。

kotlin 复制代码
fun main() {
    val result = listOf(3,2,1).first().let {
        it*it
    }
    println(result)
}

fun formatName(name:String?): String {
    return name?.let { "Whelcome, $it" } ?: "name?"
}

run

  • 和apply差不多,但返回的是lambda的执行结果,而apply返回的是接收者

  • 可以执行函数引用

  • 多个函数引用可以链式调用

    fun main() { var file = File("D:test.txt") val result = file.run { readText().contains("hava") } println(result) //执行函数引用 "hhhhh" .run(::isLong) .run(::showTip) .run(::println) }

    fun isLong(name:String) = name.length >= 3

    fun showTip(isLong:Boolean) :String { return if (isLong){ "too long" }else{ "OK" } }

with

是run函数的变体,功能行为一样,with的调用方式不同,with需要值参作为其第一个参数传入

kotlin 复制代码
fun main() {
    val result = "hkjkj".run { length >=3 }
    println(result)
    val result1 = with("hkjkj"){
        length>=3
    }
    println(result1)
}

also

和let相似,需要把接收者值参传给lambda,但also返回接收者对象。also尤其适合针对同一原始对象,可以基于原始接收者对象执行额外的链式调用

kotlin 复制代码
fun main() {
    var fileContent:List<String>
    var reuslt = File("D://Android")
        .also { println(it.name) }
        .also { fileContent = it.readLines() }
    println(fileContent)
}

takeif

takeif函数需要判断lambda中提供的条件表达式的结果,如果是true,takeif函数返回接收者对象,如果是false,返回Null。

如果需要判断某个条件是否满足,再决定是否可以赋值变量或执行某项任务,takeif就非常有用

kotlin 复制代码
fun main() {
    val result = File("D://Android")
        .takeIf { it.exists() && it.canRead() }
        ?.readText()
    println(result)
}

takeUnless

与takeif的返回结果情况相反,返回为false才会返回

let、apply和run

函数 入参 功能 返回值
let 当前调用者,可以用it代替 可以对参数it进行操作 返回lambda的结果
apply 调用当前对象的一系列函数 返回接收者
run 调用接收者的一系列函数,还可以执行函数引用,也就是调用其他函数 返回lambda的结果

let会把接收者传给lambda,而apply什么都不传;匿名函数执行完,apply会返回当前的接收者,而let会返回lambda的最后一行


欢迎关注我的公众号查看更多精彩文章!

相关推荐
AI玫瑰助手8 小时前
Python模块:import导入模块与模块的搜索路径
android·开发语言·python
嵌入式ZYXC8 小时前
第9篇:《面试题:ADC前端为什么要加运放跟随器?什么情况下可以不加?》
stm32·单片机·嵌入式硬件·面试·职场和发展
Haodukeji8 小时前
2026年上海墙面投影互动品牌新趋势,科技与艺术的完美融合
面试
yewq-cn8 小时前
Android Log System
android
问心无愧05139 小时前
ctf show web入门107
android·前端·笔记·android studio
AI科技星9 小时前
第三卷:质数王朝志 第四章:RSA护国玄阵,质数锁天地,一数镇万法
android·人工智能·架构·概率论·学习方法
AFinalStone9 小时前
Android12 U盘插拔链路源码全解析(八)实战调试与案例分析
android·frameworks
我命由我123459 小时前
Android 开发问题:View 的 getWidth、getHeight 方法返回的值都为 0
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
折哥的程序人生 · 物流技术专研18 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
程序员二叉18 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试