Kotlin 速查 — 简明参考
Kotlin 2.0 语法、空安全、协程与最常用标准库速查手册,覆盖约 80% 日常场景。
Kotlin Kotlin 2.0
JVM (kotlinc) / Multiplatform · OO · 函数式 · 多平台 · 静态 · 强类型 · 推断
学习路径
先学会 kotlinc 编译运行与 fun main → 掌握变量、类型与流程控制 → 理解空安全(可空类型 ?、安全调用 ?.、Elvis ?:)与 data class → 用 lambda、扩展函数与集合函数式操作 → 深入类、接口与泛型 → 用 try / runCatching 处理错误 → 用协程与 Flow 写并发 → 再按需学网络、时间、正则与 Gradle 构建。FAQ 节适合回头避坑。
1.Hello World 与构建环境
编译运行 Kotlin 程序:kotlinc 工具链、脚本、包结构与命令行参数。
最小程序
每个 Kotlin 程序以顶层 fun main() 为入口,println 输出到标准输出。Kotlin 2.0 支持无参数 main。
运行与构建
kotlinc 把源码编译成 JVM 字节码,java -jar 运行。Gradle 是 Kotlin 项目的主流构建工具。
Kotlin 脚本
.kts 文件可直接运行,适合小工具与自动化。脚本不需要 main 函数,顶层语句顺序执行。
包与导入
package 声明文件所属包,import 引入其他包类型。import 未使用不报错,与 Java 不同。
命令行参数
main 的参数 Array<String> 接收命令行参数,args[0] 是第一个参数。参数总是字符串需自行转换。
输出与格式化
println 输出并换行,print 不换行。字符串模板 ${} 内嵌表达式,是最常用的格式化方式。
退出码
exitProcess 立即终止程序并设置退出码,0 表示成功,非 0 表示失败。库代码不要调用它。
环境搭建
IntelliJ IDEA 社区版内置 Kotlin 支持,Android Studio 亦然。命令行则用 kotlinc 与 Gradle。
2.变量与常量
变量声明、val/var、常量、类型推断、解构与作用域。
val 与 var
val 声明只读引用,var 声明可变引用。优先使用 val,编译器会提示可改为 val 的 var。
类型推断
编译器根据初始化表达式推断变量类型,声明可省略显式类型。推断结果与显式声明等价。
显式类型
显式声明类型提升可读性,也是空安全与泛型的常见需求。类型写在变量名后,用冒号分隔。
编译期常量
const val 声明编译期常量,仅限基本类型与 String,只能出现在顶层或伴生对象中。
顶层变量
文件顶层可直接声明变量与函数,无需类包裹。顶层 val/var 是文件级全局状态。
解构声明
解构把对象拆分到多个变量。Pair、Triple 与 data class 都支持解构。
类型别名
typealias 给已有类型起别名,提高可读性。不创建新类型,与原类型完全等价。
作用域与块
变量作用域由花括号块决定,内层可访问外层变量。同作用域不能重复声明同名变量。
3.数据类型
数字、字符、布尔、数组、区间、data class 与类型转换。
数字类型
Kotlin 提供 Byte/Short/Int/Long/Float/Double 六种数字类型,后缀 L、f、u 指定具体类型。
数值运算
算术、位运算与数学函数。Int 除 Int 得到 Int,注意整数除法截断。
字符与布尔
Char 表示单个字符(单引号),Boolean 只有 true/false。字符有完整的检查与转换方法。
数组
Array<T> 是引用类型数组,IntArray 等是基本类型数组(更高效)。数组大小固定。
区间
区间 a..b 表示闭区间,until 表示开区间。常配合 for 循环与 in 判断。
字符串类型
String 是不可变字符序列,UTF-16 编码。字符串字面量用双引号,转义用反斜杠。
data class
data class 自动生成 equals/hashCode/toString/copy 与解构,用于保存数据的纯值对象。
类型转换
Kotlin 不隐式转换数字类型,需显式 toXxx() 方法。小转大也可能溢出,需注意。
Unit 与 Nothing
Unit 表示无返回值(类似 Java void)。Nothing 表示永不返回,用于必定抛错或未实现的函数。
4.引用与空安全
Kotlin 无裸指针:引用语义、可空类型、安全调用、Elvis、lateinit 与值类。
引用与对象
Kotlin 无裸指针,所有变量都是引用。JVM 自动管理生命周期,没有指针算术。
可空类型
类型加 ? 表示可为 null。可空类型不能直接调用方法,必须先判空,这是 Kotlin 空安全基石。
安全调用
?. 在对象非空时调用方法,为空则整个表达式为 null。安全调用可链式书写。
Elvis 运算符
?: 左侧为空时返回右侧默认值。右侧可为表达式,也可提前 return 或 throw。
非空断言
!! 把可空类型强转为非空,为空时抛 NPE。应避免使用,仅在逻辑上确定非空时用。
lateinit 属性
lateinit 声明稍后初始化的非空 var,用于依赖注入或框架回调。使用前未初始化会抛异常。
by lazy 委托
by lazy 首次访问时执行初始化,之后缓存结果。线程安全,适合昂贵的一次性初始化。
拷贝与相等性
== 比较结构内容,=== 比较引用同一性。data class 的 copy() 做浅拷贝。
value class
value class 包装单值并在运行时内联,消除装箱开销,类似类型安全的自定义包装类型。
5.流程控制
if、when、for、while 与智能转换,表达式风格的流程控制。
if 表达式
if 是表达式,可返回值赋给变量。Kotlin 没有三元运算符,if-else 取代它。
when 表达式
when 取代 switch,支持值、范围、类型与条件分支。表达式形式必须有 else 覆盖。
for 循环
for 遍历区间、集合、数组等可迭代对象。Kotlin 没有 C 风格的三表达式 for。
while 循环
while 先判断后执行,do-while 先执行后判断。条件必须是布尔表达式。
break 与 continue
break 退出循环,continue 跳过本轮。标签 @ 可控制嵌套循环的跳转。
智能转换
类型检查后编译器自动转换类型,无需显式强转。判空、is 检查后即可安全使用。
标签与跳转
标签 @ 标记循环或 lambda,配合 break、continue、return 实现精确跳转。
takeIf 与 takeUnless
takeIf 满足条件返回原对象否则 null,takeUnless 相反。常用于链式判空与过滤。
6.函数与 Lambda
函数声明、lambda、高阶函数、扩展函数、作用域函数与中缀函数。
函数声明
fun 声明函数,参数带类型,返回类型在参数列表后。无返回值用 Unit。
单表达式函数
函数体只有一个表达式时可用 = 简写,省略 return 与花括号。
默认与命名参数
参数可设默认值,调用时可省略。命名参数可按任意顺序传入,提高可读性。
可变参数
vararg 接收任意数量参数,函数内作为数组使用。可用展开运算符 * 传入数组。
Lambda 表达式
Lambda 是匿名函数,花括号包裹,-> 分隔参数与函数体。最后参数是 Lambda 时可用尾随语法。
高阶函数
高阶函数以函数为参数或返回值。map/filter 等标准库高阶函数是日常主力。
扩展函数
扩展函数为已有类添加方法,不修改原类。this 指向接收者对象,作用域仅限定义处。
中缀函数
infix 关键字允许函数用空格调用,像操作符。要求成员或扩展函数且只有一个参数。
作用域函数
let/run/with/apply/also 在对象上下文中执行代码。let 返回结果,apply 返回接收者。
局部函数
函数内可再定义局部函数,捕获外层变量。用于组织逻辑,减少重复。
7.字符串
字符串基础、模板、原始字符串、方法、拼接、格式化与转换。
字符串基础
String 是不可变字符序列。双引号字面量、转义序列、索引访问与遍历。
字符串模板
$变量 与 ${表达式} 把值嵌入字符串,是最常用的字符串构建方式。
原始字符串
三引号 """ 原始字符串保留换行与格式,不做转义。trimIndent 去掉公共缩进。
常用方法
标准库提供丰富的字符串方法:截取、替换、判空、去空白、填充。
拼接与 StringBuilder
循环拼接用 StringBuilder(或 buildString)避免创建大量中间字符串。
格式化
format 方法实现类似 printf 的格式化输出,支持宽度、精度与类型占位。
字符串转换
字符串与数字互转、转布尔。toXxxOrNull 系列安全转换避免异常。
分割与合并
split 按分隔符拆成列表,joinToString 把集合拼成字符串。支持多个分隔符。
8.集合
List、Set、Map、惰性序列、变换操作、分组与排序。
List 列表
listOf 创建只读列表,elementAt 与 get 按索引访问。默认 List 接口不可修改。
Set 集合
setOf 创建无重复元素的集合,元素唯一。判断存在比 List 高效。
Map 字典
mapOf 创建键值对,to 或 Pair 构造条目。按键取值,未知键可返回默认。
可变集合
mutableListOf/mutableSetOf/mutableMapOf 创建可修改集合。只读视图不能 add。
惰性序列
Sequence 惰性求值,链式操作只在终止操作时逐元素执行。处理大数据避免中间集合。
变换操作
map/filter/flatMap 等是集合处理主力,函数式风格替代手写循环。
分组与关联
groupBy 按条件分组,associate 构建键值关系,partition 一分两半。
排序
sorted/sortedBy 返回新排序列表,sort 原地排序可变列表。支持自定义比较器。
集合互转
集合、数组、Map 之间互相转换。toList/toSet/toMap/toTypedArray。
9.内存与性能
JVM 垃圾回收、对象引用、装箱、分配优化与性能分析。
JVM 垃圾回收
Kotlin/JVM 由 GC 自动管理内存,无需手动释放。对象不可达时被回收。
对象引用
Kotlin 所有对象通过引用访问,无指针。引用类型决定共享与可达性。
inline 函数
inline 在调用处展开函数体,消除 Lambda 对象创建开销。reified 泛型需配合 inline。
分配优化
减少对象分配是 JVM 性能关键。复用对象、避免装箱、使用基本类型数组。
基本类型装箱
非空基本类型局部变量用原始类型,可空或泛型时装箱。value class 可优化包装。
性能调优
先测量再优化。常见优化点:数据结构、重复计算、惰性求值与算法复杂度。
对象池
高并发场景复用对象避免频繁分配。池对象需线程安全与归还前状态清理。
性能分析
用 JFR、VisualVM 等工具分析 CPU 与内存。堆转储定位内存泄漏。
10.面向对象
类、构造函数、属性、继承、接口、泛型、data class 与密封类。
类定义
class 声明类,属性可在主构造函数或类体中声明。类默认 final,不可继承。
构造函数
主构造函数在类头声明,参数可直接声明为属性。init 块在主构造后执行。
属性
属性自动生成 getter/setter。可自定义访问器,field 指幕后字段。
继承与重写
open 类可被继承,open 成员可被重写。override 标记重写,super 访问父类。
接口
接口定义行为契约,可含默认实现与抽象成员。类可实现多个接口。
抽象类
abstract class 定义部分实现,abstract 成员由子类实现。与接口不同,抽象类可保存状态。
data class
data class 自动生成 equals/hashCode/toString/copy/componentN,适合值对象。
密封类
sealed class 限制子类在同一包/模块,when 分支可穷尽。表达受限的层次结构。
单例对象
object 声明单例,线程安全地延迟初始化。整个程序只有一份实例。
伴生对象
companion object 提供类级别成员,类似 Java 静态。可用 @JvmStatic 暴露给 Java。
泛型
泛型参数化类型。in/out 声明协变逆变,泛型函数与类型约束。
委托
by 关键字实现接口委托与委托属性。lazy/observable 管理属性,简化组合。
11.错误处理
try 表达式、自定义异常、runCatching、Result、require/check 与资源管理。
try 表达式
try 是表达式,可返回 catch 中的值。catch 匹配异常类型,finally 必定执行。
抛出异常
throw 抛出异常对象。自定义消息与异常链。require/check 是参数校验惯用法。
自定义异常
继承 Exception 或 RuntimeException 自定义异常。可携带额外字段。
runCatching
runCatching 捕获异常并返回 Result。函数式错误处理替代 try-catch。
Result 类型
Result<T> 封装成功值或失败异常,支持 map/onSuccess 等操作。常用作函数返回类型。
资源管理
use 扩展自动关闭 Closeable/AutoCloseable 资源,类似 Java try-with-resources。
require 与 check
require 参数校验,check 状态校验,error 主动失败。失败抛异常并打印消息。
Nothing 与失败
Nothing 表示永不返回,用于 todo/error 等未实现或必失败路径。类型系统理解控制流。
12.输入输出
文件读写、Path API、标准输入输出、JSON 序列化与文件操作。
读取文件
readText 一次读整个文件为字符串,readBytes 读字节。指定字符集避免乱码。
写入文件
writeText 覆盖写入,appendText 追加,writeBytes 写字节。目录需先存在。
逐行读取
readLines 读全部行,useLines 惰性流式逐行处理大文件。forEachLine 便捷遍历。
Path API
java.nio.file.Path 处理路径,Files 提供读写与目录操作。路径拼接跨平台。
标准输入
readln 读取一行,readlnOrNull 读取可空。读后手动转换为所需类型。
标准输出
println/print 输出到标准输出,println 自动换行。可输出到错误流。
JSON 序列化
kotlinx.serialization 官方序列化库,@Serializable 注解生成编解码器。Jackson 可作替代。
文件操作
判断存在、删除、重命名、大小与权限。walkTopDown 递归遍历目录。
13.常见误区
Kotlin 日常开发最容易踩的坑与正确写法,BAD/GOOD 成对展示。
滥用 !!
!! 在空值时抛 NPE,应避免。用安全调用、Elvis 或提前校验替代。
智能转换失效
可变属性或委托属性智能转换失败。赋值后需重新检查或使用局部变量。
== 与 ===
== 结构相等比较内容,=== 引用相等比较地址。对象与基本类型要分清。
可空拼接
可空值与字符串拼接时模板对 null 显示 "null"。需显式处理空值。
模板可空陷阱
模板 $a.b 解析为 a.b 属性。可空对象属性访问需 ${a?.b}。
数组协变陷阱
Array<String> 可赋给 Array<Any>,运行期可能抛 ArrayStoreException。用 List 更安全。
lateinit 未初始化
使用前未初始化抛 UninitializedPropertyAccessException。访问前检查 isInitialized。
作用域函数混淆
let/apply/run 返回值不同。用错导致返回对象而非结果。按用途选择。
伴生对象混淆
伴生对象成员不是类静态字段。Kotlin 用伴生对象实现静态语义,需 @JvmStatic 暴露。
只读视图误解
只读 List 接口只是视图,底层可变集合仍可修改。共享可变状态需拷贝。
14.并发与协程
线程、协程、async/await、Channel、Flow、互斥锁与超时控制。
线程基础
Thread 与 thread{} 创建线程。join 等待结束。并发共享状态需同步。
协程入门
launch 启动轻量协程,delay 挂起不占线程。runBlocking 阻塞等待协程完成。
async 与 await
async 并发执行并返回 Deferred,await 获取结果。awaitAll 等待多个任务。
withContext
withContext 切换调度器执行阻塞任务。IO 任务用 Dispatchers.IO,计算用 Default。
Channel 通道
Channel 在协程间传输数据,send/receive 是挂起函数。支持缓冲与关闭。
Flow 数据流
Flow 是异步冷流,collect 时才执行。支持 map/filter 等操作符与背压。
互斥与同步
原子类 AtomicInteger 做无锁计数。协程内用 Mutex 保护临界区。线程内用 synchronized。
超时与取消
withTimeout 限制协程执行时间。job.cancel 协作式取消,需检查 isActive。
15.网络编程
HTTP 请求、Ktor Client、JSON 解析、TCP Socket、HTTP 服务器与 WebSocket。
URL 简单请求
URL.readText 快速 GET。openConnection 可配置超时。适合轻量小响应。
JDK HttpClient
JDK 11+ 内置 HttpClient 发送 HTTP 请求。支持异步 sendAsync 与响应体转换。
Ktor Client
Ktor Client 是跨平台 HTTP 库,支持协程与多引擎。适合网络密集任务。
解析响应 JSON
HttpClient 获取响应后,用 kotlinx.serialization 把 JSON 反序列化为 data class。
TCP Socket
ServerSocket 监听端口,accept 接受连接。Socket 读写字节流。注意关闭资源。
HTTP 服务器
JDK 内置 HttpServer 创建轻量 HTTP 服务。createContext 注册路由处理器。
REST 设计要点
REST 用资源与 HTTP 方法表达操作。data class 描述请求响应,状态码语义准确。
WebSocket
OkHttp 提供 WebSocket 客户端,onOpen/onMessage 回调处理双向消息。
16.日期与时间
Instant、LocalDate、格式化、解析、Duration、Period 与带时区时刻。
当前时间戳
Instant.now 记录瞬时点。currentTimeMillis 取毫秒,nanoTime 测量间隔。
LocalDate
LocalDate 表示年月日,of/now 创建。加减天数、判断与取分量。
LocalDateTime
LocalDateTime 含日期与时间。withHour 调整字段,plusHours 加减。
格式化输出
DateTimeFormatter.ofPattern 自定义格式。yyyy-MM-dd HH:mm:ss 是常用模式。
解析日期
LocalDate.parse 解析字符串。自定义格式需配 DateTimeFormatter。失败抛异常。
Duration 时长
Duration 表示基于纳秒的时间量,between 计算差值。适合度量耗时。
Period 周期
Period 表示年/月/日差,between 计算年龄。ofWeeks/ofDays 构造周期。
带时区时刻
ZonedDateTime 含时区。withZoneSameInstant 切换时区。存储用 UTC 展示转本地。
17.进程与系统
命令行参数、环境变量、ProcessBuilder 执行外部命令、系统信息与关闭钩子。
参数与环境
main 的 args 收命令行参数。System.getenv 读环境变量,getProperty 读系统属性。
ProcessBuilder
ProcessBuilder 执行外部命令,directory 设工作目录。redirectErrorStream 合并错误流。
退出码
waitFor 阻塞等待子进程。退出码 0 表示成功。exitProcess 设置当前进程退出码。
捕获子进程输出
读取 inputStream 获取子进程输出。waitFor 带超时防卡死。destroyForcibly 强杀。
系统信息
读取 JVM 与操作系统属性。Runtime 查看内存。用于日志与诊断。
关闭钩子
addShutdownHook 注册 JVM 退出时执行的任务。用于清理资源与保存状态。
实时读取输出
按行读取子进程输出流,实时处理进度。useLines 自动关闭流。
终止进程
destroy 温和终止,destroyForcibly 强杀。超时未结束则强制终止。
18.正则表达式
Regex 基础、匹配查找、捕获分组、替换分割、常用模式与标志选项。
Regex 基础
Regex 创建正则对象。matches 全匹配,containsMatchIn 判断包含,matchEntire 整串匹配。
字面量与选项
Regex.escape 转义特殊字符。IGNORE_CASE 忽略大小写,MULTILINE 多行模式。
查找匹配
find 返回第一个匹配,findAll 返回全部匹配。MatchResult 可访问值、分组与区间。
捕获分组
括号定义捕获组。groupValues 按序号取值,命名分组用 groups["name"]。
正则替换
replace 替换所有匹配,replaceFirst 只替换首个。替换闭包可访问捕获组。
正则分割
split(Regex) 按正则切分字符串。比字符串分割更灵活,支持多分隔符。
常用正则
邮箱、手机号、IPv4、中文字符与 URL 的常用正则模板。按需调整边界。
标志选项
RegexOption 常量控制匹配行为。内联标志 (?i)(?m)(?s) 可写在模式里。
19.构建与依赖
Gradle Kotlin DSL、插件、依赖、测试、协程与序列化库配置。
Gradle 基础
build.gradle.kts 用 Kotlin DSL 配置构建。mainClass 指定运行入口。
Kotlin 插件
kotlin("jvm") 声明 JVM 项目。jvmToolchain 指定 JDK 版本。Wrapper 固定 Gradle。
依赖配置
implementation/testImplementation/compileOnly 等配置控制依赖作用域。
运行与分发
application 插件提供 run/installDist 任务。run --args 传命令行参数。
测试
kotlin.test 提供断言。testImplementation 引入测试库。test 任务运行全部测试。
协程依赖
kotlinx-coroutines-core 提供协程核心。Android/Swing 版本提供对应主线程调度器。
序列化依赖
kotlin plugin.serialization 插件加 kotlinx-serialization-json 库实现 JSON 编解码。
打包发布
distribution 插件生成可分发压缩包。publishToMavenLocal 发布到本地仓库。
关于本速查
本页是 Kotlin 2.0 的自包含速查手册,覆盖语言核心与最常用标准库在真实项目中约 80% 的常见用法。内容偏向现代惯用法:空安全(可空类型 ?、安全调用 ?.、Elvis ?:)、data class 与 sealed class、作用域函数、扩展函数,以及协程与 Flow 的异步并发模型。权威参考见官方 Kotlin 文档与 Kotlin in Action。 19 个章节各自聚焦一个主题——从第一个程序到协程、空安全与常见误区。每节拆成 8–14 个带示例的小节(每个 5–20 行),共约 160 个主题。代码片段刻意短小、自解释,注释为简体中文。 所有处理都在浏览器中完成——无上传、无追踪。本页是 GuruToolkit 免费开发者工具集的一部分;代码片段可自由使用,无任何担保。
版本 2.1.0