Kotlin标准函数库学习

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

apply 可以用在初始化时,的不断引用的情况。

kotlin 复制代码
//原始代码
val person = Person()
person.name = "John"
person.age = 30

//优化后的代码
val person = Person().apply {
    name = "John"
    age = 30
}

let:let 函数能使某个变量作用于其lambda 表达式里,让it 关键字(详见第5 章)能引用它。

kotlin 复制代码
//1. 非空检查 (Null Checks)
val str: String? = "Hello"
if (str != null) {
    println(str.length)
}

val str: String? = "Hello"
str?.let {
    println(it.length)
}

//2. 数据转换并返回一个新值
fun convertToInt(value: String): Int {
    val intValue = Integer.parseInt(value)
    return intValue * 2
}

fun convertToInt(value: String): Int {
    return value.let { Integer.parseInt(it) * 2 }
}

//3.可以避免临时变量
val name: String? = getName()
val length: Int
if (name != null) {
    length = name.length
} else {
    length = 0
}
println("Length is $length")

val name: String? = getName()
val length = name?.let { it.length } ?: 0
println("Length is $length")

//4. 链式调用
data class User(val name: String, val age: Int)

fun processUser(user: User?) {
    user?.let {
        println("Processing user ${it.name}, age ${it.age}")
    }?.run {
        // 进一步处理...
    }
}

run:光看作用域行为,run 和apply 差不多。但与apply 不同,run函数不返回接收者。比较用run 的链式调用和以下嵌套语法

kotlin 复制代码
//1. 初始化带有逻辑的对象
val person = Person()
person.name = if (someCondition) "John" else "Jane"
person.age = calculateAge()

val person = Person().run {
    name = if (someCondition) "John" else "Jane"
    age = calculateAge()
    this // 如果需要返回这个对象本身
}

//2. 局部作用域,避免创建临时变量
fun calculate(): Int {
    return run {
        val a = 5
        val b = 10
        a + b
    }
}
//3. 非空判断与操作
val str: String? = "Hello"
str?.run {
    println(length)
}
//4. 配置对象并返回结果
val result = TextView(context).run {
    textSize = 16f
    setTextColor(Color.BLACK)
    setPadding(10, 10, 10, 10)
    textSize // 返回配置后的textSize
}

with:是run 的变体。它们的功能行为是一样的,但with 的调用方式不同。和之前介绍的标准函数都不一样,调用with 时需要值参作为其第一个参数传入。

kotlin 复制代码
        val nameTooLong = with("Polarcubis, Supreme Master of NyetHack") {
            length >= 20
        }.run(::println)

also:和let 函数功能相似。和let 一样,also 也是把接收者作为值参传给lambda。但有一点不同:also 返回接收者对象,而let 返回lambda 结果。

kotlin 复制代码
        var fileCOntents: List<String>
        File("file.txt").also { println(it.name) }
            .also { fileCOntents = it.readLines() }

和 apply 类似,不过引用时使用 it。

takeIf:和其他标准函数有点不一样,takeIf 函数需要判断lambda中提供的条件表达式(叫predicate),给出true 或false 结果。

kotlin 复制代码
        val fileContents = File("myfile.txt")
            .takeIf { it.canRead() && it.canWrite() }
            ?.readText()

//        val file = File("myfile.txt")
//        val fileContents = if (file.canRead() && file.canWrite()) {
//            file.readText()
//        } else {
//            null
//        }

takeUnless:。takeUnless 和takeIf 唯一的区别是:只有判断你给定的条件结果是false 时,takeUnless 才会返回原始接收者对象。

kotlin 复制代码
val fileContents = File("myfile.txt").takeUnless { it.isHidden }?.readText()
相关推荐
点心的游戏开发世界10 小时前
Unity C# 脚本学习笔记:命名空间与 using
学习·unity·c#
2601_9620715711 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww894911111 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
香芋芋圆11 小时前
AI 冲击内卷之下,普通前端如何破局?WebGIS—— 低门槛突围赛道
前端·javascript·人工智能·学习·职场发展
点心的游戏开发世界12 小时前
Unity C# 脚本学习笔记:泛型
学习·unity·c#
tju新生代魔迷13 小时前
Verilog HDL 学习笔记(十三)| 第13章 编程语言接口(PLI)
笔记·学习
zww894911114 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设15 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳15 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
我爱cope16 小时前
【计算机网络 | 网络层11:ICMP 协议:Ping 和 Traceroute 的底层原理】
网络·学习·计算机网络