Kotlin 命令速查表 - Kotlin 常用语法与协程编程大全
这套速查给写 Kotlin 的开发者——无论是 Android 应用、JVM 后端还是随手写脚本——聚焦每天都碰的几件事:用 kotlinc/Gradle 编译运行、空安全那套写法(安全调用、Elvis、非空断言)、filter/map/groupBy 等集合操作符,以及协程做结构化并发。与泛泛的语法罗列不同,条目按"这句代码解决什么问题"组织,从"避免空指针"到"把 I/O 挪出主线程"都有对应。读完应能写出没有散落 !! 的空安全链、流式处理集合,并让协程按作用域正确取消。
编译与运行 5
kotlinc main.kt -include-runtime -d main.jar编译为可执行 jar
java -jar main.jar运行编译后的 jar
kotlinc -script script.kts运行 Kotlin 脚本
kotlinc-jvm进入 REPL
kotlin main.kt直接运行(无需编译)
Gradle 构建 5
./gradlew build执行完整构建(编译+测试+打包),发布前统一用 gradlew 避免本地环境差异
./gradlew run运行配置了 application 插件的主类,本地快速起应用入口
./gradlew test运行 JUnit 等测试套件,失败会让构建失败,可在 CI 里拦截回归
./gradlew clean清空 build 目录构建产物,配合 build 得到干净的 from-scratch 构建
./gradlew dependencies打印依赖及其解析版本,排查冲突和升级影响面
空安全 5
var name: String? = null用 ? 声明可空类型,后续赋值可以置 null;非空断言前先确认真不为空
name?.length安全调用:name 为 null 时整个表达式返回 null 而不是抛 NPE,是首选写法
name ?: "default"Elvis 操作符:左侧为 null 时改用右侧默认值,一行搞定兜底
name!!.length非空断言:强行当非空去访问,若实际为 null 会抛 NPE,需慎用、多数可被 ?. 和 ?: 替代
val len = name?.length ?: 0组合:安全调用拿不到就用 0 兜底,链式中最常用的 null-safe 表达式
集合操作 10
list.filter { it > 5 }保留满足条件的元素并返回新列表,原列表不变
list.map { it * 2 }对每个元素应用变换,返回长度相同的新列表,通常做 DTO 到视图模型转换
list.flatMap { it.split(",") }每个元素映射到一个集合再拍平为一个列表,常用于一对多展开
list.groupBy { it.category }按任意键把列表分组为 Map,如按分类聚合同类对象
list.sortedBy { it.age }按指定字段返回升序新列表,配合 reversed 可做倒序
list.distinct()按相等性去重并返回新列表,去重排序逻辑由 equals 决定
list.take(5)取前 5 个元素作为新列表,常用于分页或截断展示
list.drop(3)丢弃前 3 个元素并返回其余,常与 take 配对实现分页
list.firstOrNull { it.id == 1 }返回第一个匹配的元素,没有匹配返回 null,比 first() 更安全不抛异常
list.partition { it > 0 }按条件一次分成两半:成对的 Pair(first=满足, second=不满足)
协程 Coroutine 6
runBlocking { ... }阻塞式协程(测试用)
launch { ... }启动协程(不返回值)
async { ... }启动协程(返回 Deferred)
delay(1000)非阻塞延迟
withContext(Dispatchers.IO) { ... }切换上下文
coroutineScope { ... }创建协程作用域
类与对象 8
data class User(val name: String, val age: Int)数据类(自动生成 equals/hashCode/toString/copy)
sealed class Result密封类(受限继承层次,when 分支可穷举)
object Singleton { val x = 1 }单例对象声明
companion object { val MAX = 100 }伴生对象(类级静态成员)
class User(val name: String)主构造函数声明属性
open class Animal; class Dog : Animal()继承(父类需 open)
interface Drawable { fun draw() }接口定义
enum class Color { RED, GREEN, BLUE }枚举类
作用域函数与委托 8
obj.let { it.foo() }let:it 接收者,返回 lambda 结果
obj.apply { this.x = 1 }apply:this 接收者,返回对象本身(初始化用)
obj.also { it.log() }also:it 接收者,返回对象本身(副作用用)
obj.run { compute() }run:this 接收者,返回 lambda 结果
with(obj) { foo() }with:this 接收者,返回 lambda 结果
val lazyVal by lazy { init() }延迟初始化委托(首次访问时计算)
var x by Delegates.observable(0) { _, old, new -> }可观察属性委托
val v by mapMap 委托(从 map 按键取值)
提示
- Kotlin 的空安全是编译期检查,!! 能不用就不用。
- 协程的 launch 和 async 区别:launch 返回 Job,async 返回 Deferred(可 await)。
- 集合操作链式调用很优雅,但大数据量时注意中间集合的内存开销。
- data class 自动生成 copy/equals/hashCode/toString,适合纯数据模型。
- 作用域函数选择:初始化用 apply,转换用 let/let it,副作用用 also。
- sealed class 搭配 when 使用时编译器会检查分支是否穷举,无需 else。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。