kotlin官網:other-destructuring declarations
解構宣告可以方便地將乙個物件分解成多個變數:
val
(name, age) = person
println
(name)
println
(age)
上例中,解構宣告會編譯成:
val name = person.component1()
val age = person.component2()
這裡的componentn()函式為過載的運算子函式,需要有operator修飾,n為正整數。
解構宣告也支援在for迴圈中使用:
for ((a, b) in collection)
a和b分別接收collection中元素item的component1()和component2()的返回值。
有時乙個函式需要返回兩個值,例如成對的狀態和結果,此時可以返回支援解構宣告的類的例項,例如資料類(資料類會由編譯器自動生成析構函式)。
標準庫中有pair類實現,當然自己定義乙個取個好名字更好。
data class result(val result: int, val status: status)
fun function(...): result
// now, to use this function:
val (result, status) = function(...)
遍歷map的理想方式:
for ((key, value) in map)
要實現這個效果,需要滿足:
標準庫中提供了map的相應擴充套件函式,可以直接使用解構宣告和for迴圈遍歷map:
operator fun map
.iterator(): iterator> = entryset().iterator()
operator fun map.entry.component1() = getkey()
operator fun map.entry.component2() = getvalue()
對於解構宣告中不需要的引數,可以使用下劃線代替:
val
(_, status) = getresult
()
這樣對於下劃線的引數不會呼叫componentn()函式,直接跳過。
lambda的引數也支援解構宣告:
map.mapvalues !" }
map.mapvalues
注意區分「多個引數」的「解構宣告」的區別,引數沒有括號,解構宣告有括括號:
// 1個引數
// 2個引數
// 1個解構宣告
// 1個解構宣告和1個引數
lambda中的解構宣告也支援下劃線標明未使用引數:
map.mapvalues
支援指定型別,可以給解構宣告整體指定,也可以單獨給解構宣告中某一項指定:
map
.mapvalues
map.mapvalues
Kotlin學習筆記5 13 其他 型別別名
kotlin官網 other type aliases 型別別名可以用來給乙個已知型別起另外乙個名字,如果有型別名字太長可以再起乙個短一些的替代。經常用於帶泛型的類,例如集合 typealias nodeset set typealias filetable mutablemap 給函式型別起別名 ...
Kotlin學習筆記5 7 其他 運算子過載
kotlin官網 other operator overloading kotlin支援過載運算子,運算子有對應固定名字的函式,可以定義為成員函式或者擴充套件函式,函式前加operator。表示式轉換 aa.unaryplus aa.unaryminus aa.not 編譯器的轉換步驟 注意,對於基...
kotlin學習筆記
屬性委託在單獨一頁中講 屬性委託。委託模式已經證明是實現繼承的乙個很好的替代方式,而 kotlin 可以零樣板 地原生支援它。derived類可以通過將其所有公有成員都委託給指定物件來實現乙個介面base inte ce base class baseimpl val x int base clas...