Kotlin學習筆記5 1 其他 解構宣告

2021-08-15 10:57:27 字數 1705 閱讀 4561

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...