Kotlin 日常开发常用语法糖整理 —— 速记

Kotlin 提供了大量语法糖,让代码更简洁、更安全、更易读。以下是开发中最常用的一些语法糖,附代码示例和使用说明。

1. let -- 作用域函数

let 是一个作用域函数,它将调用者作为参数(it)传入代码块,并返回代码块的最后一行结果。常用于安全调用限定变量作用域

基本用法

kotlin 复制代码
val name: String? = "Kotlin"
name?.let {
    println("Name length: ${it.length}")  // it 是非空的 name
}

链式处理

kotlin 复制代码
val result = listOf(1, 2, 3)
    .map { it * 2 }
    .filter { it > 2 }
    .let { 
        println("Processed list: $it")
        it.sum() 
    }  // 返回 sum

典型场景:避免重复判断空值

kotlin 复制代码
// 传统写法
if (user != null && user.address != null) {
    println(user.address.street)
}
// 使用 let
user?.address?.let { addr ->
    println(addr.street)
}

2. in -- 范围检查与集合成员判断

in 用于检查一个值是否在某个范围 内,或者是否属于某个集合 。对应的否定形式是 !in

范围检查

kotlin 复制代码
val score = 85
if (score in 60..100) {
    println("及格")
}

// until:不包含上界
for (i in 0 until 10) {  // 0..9
    print("$i ")
}

// downTo:递减
for (i in 10 downTo 1) {
    print("$i ")
}

集合成员判断

kotlin 复制代码
val list = listOf("apple", "banana", "cherry")
if ("banana" in list) {
    println("Found")
}

val map = mapOf(1 to "one", 2 to "two")
if (1 in map) { // 检查 key 是否存在
    println(map[1])
}

when 表达式中使用

kotlin 复制代码
when (x) {
    in 1..10 -> println("1~10")
    in 11..20 -> println("11~20")
    else -> println("Other")
}

3. as? -- 安全类型转换(慎用 as

as? 用于安全类型转换 :如果转换失败,返回 null,而不是抛出 ClassCastException

对比 as

kotlin 复制代码
val obj: Any = "Hello"

// ❌ 不安全的 as:转换失败会抛异常
val num = obj as Int  // ClassCastException

// ✅ 安全的 as?:失败返回 null
val numSafe = obj as? Int  // null

推荐:总是使用 as? 除非你 100% 确定类型

kotlin 复制代码
fun getStringLength(obj: Any): Int? {
    // obj as? String 返回 String? 类型
    return (obj as? String)?.length
}

⚠️ 慎用 as :不加 ? 的强制转换一旦类型不匹配就会崩溃。只有在你完全确定类型,且失败应该被视为严重 bug 时才用 as(例如在框架内部的类型擦除补救)。日常代码中优先使用 as? + 空处理。

4. is -- 类型检查(智能转换)

is 用于检查一个对象是否是指定类型(或其子类型)。配合 !is 检查否定。一旦通过 is 检查,Kotlin 编译器会自动智能转换为该类型,无需显式强转。

基本用法

kotlin 复制代码
fun printLength(obj: Any) {
    if (obj is String) {
        // 此处 obj 自动转换为 String 类型
        println(obj.length)   // 不需要 (obj as String).length
    }
}

when + is

kotlin 复制代码
fun describe(obj: Any) = when (obj) {
    is String -> "String of length ${obj.length}"
    is Int -> "Integer"
    is Boolean -> "Boolean"
    else -> "Unknown"
}

可空类型的智能转换

kotlin 复制代码
val str: String? = "Kotlin"
if (str is String) {   // 实际上 is String 已经排除了 null
    println(str.length) // 智能转换为非空 String
}

5. until -- 开区间范围

until 用于创建一个不包含上界 的整数范围。常用于循环,代替 0..n-1

基本用法

kotlin 复制代码
for (i in 0 until 10) {   // 0..9
    print("$i ")
}

.. 对比

kotlin 复制代码
// .. 包含上界
for (i in 0..5) print(i)  // 0 1 2 3 4 5

// until 不包含上界
for (i in 0 until 5) print(i)  // 0 1 2 3 4

常见场景:遍历数组索引

kotlin 复制代码
val arr = arrayOf("a", "b", "c")
for (i in arr.indices) {          // indices 内部使用了 until
    println(arr[i])
}
// 等价于
for (i in 0 until arr.size) { ... }

6. downTo -- 递减范围

downTo 创建一个递减的整数范围,常用于反向循环。

基本用法

kotlin 复制代码
for (i in 10 downTo 1) {
    print("$i ")   // 10 9 8 ... 1
}

指定步长

kotlin 复制代码
for (i in 10 downTo 1 step 2) {
    print("$i ")   // 10 8 6 4 2
}

遍历列表反向

kotlin 复制代码
val list = listOf("a", "b", "c")
for (i in list.lastIndex downTo 0) {
    println(list[i])  // c, b, a
}

7. ?. -- 安全调用操作符

?. 是空安全调用的核心语法。如果接收者不为 null,则调用属性或方法;否则直接返回 null,不会抛出 NullPointerException

基本用法

kotlin 复制代码
val str: String? = "Kotlin"
val len = str?.length  // 返回 Int? = 5

val nullStr: String? = null
val len2 = nullStr?.length  // 返回 null,不会崩溃

链式安全调用

kotlin 复制代码
class Address(val street: String)
class User(val address: Address?)

val user: User? = User(Address("Main St"))
val street = user?.address?.street  // 任何一个为 null,结果就是 null

结合 let 执行非空代码块

kotlin 复制代码
user?.let {
    println(it.address)   // 仅当 user 不为 null 时执行
}

?:(Elvis 操作符)配合提供默认值

kotlin 复制代码
val length = str?.length ?: 0   // 如果 str 为 null,则用 0

总结表格

语法糖 作用 示例代码
let 作用域函数,安全执行非空逻辑 name?.let { println(it.length) }
in 检查属于范围或集合 if (x in 1..10), if ("ok" in list)
as? 安全类型转换(失败返 null) val num = obj as? Int
is 类型检查 + 智能转换 if (obj is String) println(obj.length)
until 开区间范围(不含上界) for (i in 0 until size)
downTo 递减范围 for (i in 10 downTo 1)
?. 安全调用,避免空指针 val len = str?.length

这些语法糖是 Kotlin 日常开发中使用频率最高的,熟练掌握它们能显著提升编码效率和代码可读性。

相关推荐
想你依然心痛1 小时前
手机远程控制电脑教程:安卓iOS远程桌面推荐、免费工具配置与远程办公技巧
android·智能手机·电脑
方白羽1 小时前
一份 AGENTS.md,让 Android AI 代码规范率飙升
android·app·客户端
杊页2 小时前
第二板块:Android 四大组件标准化学理 | 第八篇:Service 后台执行实体与优先级
android
杊页2 小时前
第二板块:Android 四大组件标准化学理 | 第九篇:BroadcastReceiver 事件分发与有序广播
android
Chelsea05222 小时前
PC浏览器在线调试 Android 浏览器教程-chrome://inspect/#devices
android·前端·chrome
popcorn_min2 小时前
共享单车需求预测:时间特征工程 + 随机森林,R² 达到 0.931
随机森林·r语言·kotlin
Attachment George2 小时前
山东大学软件学院-项目实训-个人开发日志(十):材料问答链路开发——文档解析、OCR兜底与持续追问完善
python·ai·langchain·kotlin·rag
我命由我123452 小时前
Android 开发问题:EditText 控件的 android:imeOptions=“actionDone“ 属性不生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime