在 Kotlin 中,解構是一種語法糖,允許將一個對象分解為多個獨立的變量。 這種特性可以讓代碼更簡潔、易讀,尤其適用于處理數據類、集合(如 Pair
、Map
)或其他結構化數據。
1 解構的核心概念
解構通過定義 componentN()
(N
為整數,從 1 開始)函數實現。任何類只要聲明了 component1()
、component2()
等函數,即可被解構。
解構聲明:
val (變量1, 變量2, ...) = 對象
2 解構的使用場景和示例
2.1 數據類的解構
Kotlin 的數據類(data class)默認自動生成解構函數,無需手動實現 componentN()
函數。
示例:數據類的解構
data class User(val name: String, val age: Int)// 創建對象
val user = User("Eileen", 34)
// 解構為多個變量
val (name, age) = user
println("name = $name, age = $age") // name = Eileen, age = 34
原理:解構實際上是調用對象的 component1()
、component2()
等函數:
val name = user.component1()
val age = user.component2()
2.2 普通類的解構
如果要普通類支持解構,需要手動實現 componentN()
函數。
示例:數據類的解構
class Book(val title: String, val author: String, val price: Double) {// 手動聲明解構函數operator fun component1() = titleoperator fun component2() = authoroperator fun component3() = price
}// 使用解構
val book = Book("Kotlin Guide", "Alice", 49.99)
val (title, author, price) = book
println("《$title》 作者: $author, 價格: $price") // 《Kotlin Guide》 作者: Alice, 價格: 49.99
2.3 集合的解構
集合(如 List
、Pair
、Map
)支持解構,常用于遍歷或直接提取元素。
val (first, second) = Pair("A", "B")
println("$first, $second") // A, B// 解構 List(需確保元素數量匹配)
val list = listOf(1, 2, 3)
val (a, b, c) = list
println("$a, $b, $c") // 1, 2, 3// 遍歷 Map 時解構條目
val map = mapOf("key1" to 1, "key2" to 2)
for ((key, value) in map) {println("$key -> $value")// key1 -> 1// key2 -> 2
}
2.4 解構與下劃線占位符
如果不需要某些屬性,可用 _
占位符跳過:
data class Point(val x: Int, val y: Int, val z: Int)val point = Point(10, 20, 30)
val (x, _, z) = point // 忽略 y 屬性
println("x = $x, z = $z")
2.5 Lambda 參數中的解構
Lambda 參數支持解構(需明確聲明參數類型):
data class User(val name: String, val age: Int)val users = listOf(User("Eileen", 34), User("Bob", 24))users.forEach { (name, age) ->println("$name 的年齡是 $age")// Eileen 的年齡是 34// Bob 的年齡是 24
}
3 解構的限制和注意事項
- 最多 5 個組件: Kotlin 標準庫中的
Pair
和Triple
分別支持 2 個和 3 個組件。如果需要更多,可以使用數據類或自定義類; - 順序固定: 解構變量的順序與
componentN()
函數的順序一致,無法調整; - 不可以跳過中間屬性: 使用
_
只能跳過不需要的屬性,但需要按順序結構;