摘要说明

函数标准库常用的有:
1、apply- 对象配置初始化

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

使用场景:

  • ✅ 对象初始化配置
  • ✅ Android View 初始化
  • ✅ 集合初始化
  • ✅ Builder 模式
  • ✅ 链式初始化多个对象

使用介绍:

// Builder 模式 - 最常用
val user = User().apply {
    name = "赵六"
    email = "zhaoliu@example.com"
    age = 35
    isActive = true
}
// apply 返回 user 对象本身

// 链式初始化多个对象
val userList = mutableListOf<User>()
    .apply { add(User().apply { name = "张三" }) }
    .apply { add(User().apply { name = "李四" }) }
    .apply { add(User().apply { name = "王五" }) }

// 集合初始化
val config = HashMap<String, String>().apply {
    put("host", "localhost")
    put("port", "8080")
    put("database", "mydb")
}

// 复杂对象初始化
val view = EditText(context).apply {
    hint = "请输入用户名"
    inputType = InputType.TYPE_CLASS_TEXT
    setTextColor(Color.BLACK)
    textSize = 16f
}

// 条件初始化
val button = Button(context).apply {
    text = if (isAdmin) "删除" else "编辑"
    setOnClickListener { 
        if (isAdmin) deleteItem() else editItem()
    }
}

2、let - 安全调用和链式操作

能使某个变量作用于其lambda表达式里,让it关键字能引用。let和apply比较,let会把接收者传给lambda,而apply什么都不传,匿名执行完函数;apply会返回当前接收者,而let会返回lambda最后一行。

使用介绍:

// 基础使用
val result = "Kotlin".let { str ->
    str.length  // 返回 Lambda 结果
}
println(result)  // 输出: 6

// 非空检查(最常用)
val text: String? = "Hello"
text?.let { 
    println("文本长度: ${it.length}")  // 仅在非空时执行
}

// 链式操作
val output = "  Hello Kotlin  "
    .let { it.trim() }
    .let { it.uppercase() }
    .let { "Result: $it" }
println(output)  // Result: HELLO KOTLIN

// 返回新值
val numbers = listOf(1, 2, 3, 4, 5)
val isValid = numbers
    .let { it.size > 3 }  // 返回 Boolean
println(isValid)  // true

// 参数重命名增加可读性
val person = Person("张三", 25)
person.let { p ->
    println("姓名: ${p.name}, 年龄: ${p.age}")
}

3、run - 计算和初始化

1)光看作用域行为,run和apply差不多,但与apply不同,run函数不返回接收者,run返回的是lambda结果,也就是true或者false。2)执行函数引用

使用介绍:

// 基础使用
val result = run {
    val a = 1
    val b = 2
    a + b  // Lambda 最后一个表达式作为返回值
}
println(result)  // 3

// 对象初始化和方法调用
val person = Person("李四", 30).run {
    this.email = "lisi@example.com"
    this.greet()  // 调用方法
    // 返回 greet() 方法的结果
}

// 复杂逻辑块
val config = StringBuilder().run {
    append("配置信息:\n")
    append("版本: 1.0\n")
    append("作者: Kotlin\n")
    toString()  // 返回最终字符串
}
println(config)

// 与 let 结合
val age = 25
val category = age.takeIf { it >= 18 }.run { 
    "成人"
} ?: "未成年"

5、also - 副作用和链式调用

和let函数功能相似。和let一样also也是把接受者作为参数值传给lambda,但是有一点不同:also返回接收者对象,而let返回lambda结果,因为这个差异,also尤其适合针对同一原始对象,处理事务,既然also返回的是接收者对象,你就可以基于原始接收者对象执行额外的链式调用。

使用介绍:

// 日志和调试
val numbers = mutableListOf(1, 2, 3)
    .also { println("初始列表: $it") }  // 副作用
    .apply { add(4) }
    .also { println("添加后: $it") }
    .apply { add(5) }
    .also { println("最终列表: $it") }

// 返回对象继续链式调用
val result = "Kotlin"
    .also { println("处理: $it") }
    .also { checkLength(it) }
    .also { println("验证完成") }

// 打印调试信息
val number = 42
    .also { println("原始值: $it") }
    .also { if (it < 0) println("负数!") }
    .also { if (it % 2 == 0) println("偶数") }

// 验证和记录
data class Order(val id: Int, val amount: Double)

val order = Order(1001, 999.99)
    .also { logger.info("订单已创建: ${it.id}") }
    .also { analytics.track("order_created", mapOf("amount" to it.amount)) }
    .also { saveToDatabase(it) }

// 条件检查
val email = "user@example.com"
    .also { if (!it.contains("@")) throw IllegalArgumentException("无效邮箱") }
    .also { println("邮箱验证通过: $it") }

6、takeIf - 满足条件返回对象,否则 null

takeif函数需要判断lambda中提供的条件表达式,给出true或false结果,如果判断结果是true,从takeIf函数返回接收者对象,如果是false则返回null。如果需要判断某个条件是否满足,再决定是否可以赋值变量或执行某项任务,takeif就非常有用,takeif函数类似于if语句,但它的优势是可以直接在对象实例上调佣避免了临时变量赋值的麻烦

使用介绍:

    // 如果条件返回false,则文件返回null
    val readText = File("E://text_demo.txt")
        .takeIf { it.exists() && it.canRead() }
        ?.readText()
    println(readText)
    
输出结果:文档内容

7、takeUnless - 不满足条件返回对象,否则 null

takeif的函数辅助类takeUnless,只有判断你给定的条件 结果是false时,takeUnless(除非)才会返回原始接收者对象

使用介绍:

val age = 20
// 核心:takeUnless 是反向操作
val notAdult = age.takeUnless { it >= 18 }
println(notAdult)  // null

val child = age.takeUnless { it >= 18 }
println(child)  // null
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐