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