在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ Kotlin解構(gòu)聲明
Kotlin內(nèi)聯(lián)函數(shù)
Kotlin開發(fā)環(huán)境設(shè)置(Eclipse)
Kotlin調(diào)用Java代碼
Kotlin使用Ant
Kotlin編譯器插件
Kotlin相等性
Kotlin JavaScript模塊
編寫Kotlin代碼文檔
Kotlin返回和跳轉(zhuǎn)
Kotlin異常處理
Kotlin可見性修飾符
Kotlin委托
Kotlin委托屬性
Kotlin編碼約定/編碼風(fēng)格
Kotlin基礎(chǔ)語法
使用Kotlin進(jìn)行服務(wù)器端開發(fā)
Kotlin接口
Kotlin反射
Kotlin類型別名
Kotlin枚舉類
Kotlin當(dāng)前版本是多少?
Kotlin注解處理工具
Kotlin類型的檢查與轉(zhuǎn)換
Kotlin屬性和字段
Kotlin類型安全的構(gòu)建器
Kotlin相比Java語言有哪些優(yōu)點(diǎn)?
Kotlin JavaScript反射
Kotlin 是什么?
Kotlin泛型
Kotlin慣用語法
Kotlin與OSGi
Kotlin數(shù)據(jù)類型
Kotlin是面向?qū)ο筮€是函數(shù)式語言?
Kotlin動態(tài)類型
Kotlin協(xié)程
Kotlin操作符符重載
Kotlin使用Gradle
Kotlin密封類
Kotlin兼容性
Kotlin集合
Kotlin調(diào)用JavaScript
Kotlin null值安全
Kotlin函數(shù)
Kotlin開發(fā)環(huán)境設(shè)置(IntelliJ IDEA)
Kotlin嵌套類
Kotlin控制流程
Kotlin和Java語言比較
Kotlin 與 Java 語言兼容嗎?
Kotlin教程
Kotlin類和繼承
Kotlin對象表達(dá)式和對象聲明
JavaScript中調(diào)用Kotlin
Kotlin區(qū)間/范圍
Kotlin數(shù)據(jù)類
Kotlin lambda表達(dá)式
Kotlin是免費(fèi)的嗎?
Kotlin包
使用Kotlin進(jìn)行Android開發(fā)
在Java中調(diào)用Kotlin代碼
Kotlin this表達(dá)式
使用Kotlin進(jìn)行JavaScript開發(fā)
Kotlin擴(kuò)展
Kotlin解構(gòu)聲明
Kotlin注解
Kotlin使用Maven

Kotlin解構(gòu)聲明

有時把一個對象 解構(gòu) 成很多變量會很方便,例如:

val (name, age) = person

這種語法稱為 解構(gòu)聲明 。一個解構(gòu)聲明同時創(chuàng)建多個變量。
我們已經(jīng)聲明了兩個新變量:nameage,并且可以獨(dú)立使用它們:

println(name)
println(age)

一個解構(gòu)聲明會被編譯成以下代碼:

val name = person.component1()
val age = person.component2()

其中的 component1()component2() 函數(shù)是在 Kotlin 中廣泛使用的 約定原則 的另一個例子。
(參見像 +*for{: .keyword }-循環(huán)等操作符)。
任何表達(dá)式都可以出現(xiàn)在解構(gòu)聲明的右側(cè),只要可以對它調(diào)用所需數(shù)量的 component 函數(shù)即可。
當(dāng)然,可以有 component3()component4() 等等。

請注意,componentN() 函數(shù)需要用 operator 關(guān)鍵字標(biāo)記,以允許在解構(gòu)聲明中使用它們。

解構(gòu)聲明也可以用在 for{: .keyword }-循環(huán)中:當(dāng)你寫

for ((a, b) in collection) { …… }

變量 ab 的值取自對集合中的元素上調(diào)用 component1()component2() 的返回值。

例:從函數(shù)中返回兩個變量

讓我們假設(shè)我們需要從一個函數(shù)返回兩個東西。例如,一個結(jié)果對象和一個某種狀態(tài)。
在 Kotlin 中一個簡潔的實(shí)現(xiàn)方式是聲明一個數(shù)據(jù)類并返回其實(shí)例:

data class Result(val result: Int, val status: Status)
fun function(……): Result {
    // 各種計算

    return Result(result, status)
}

// 現(xiàn)在,使用該函數(shù):
val (result, status) = function(……)

因?yàn)閿?shù)據(jù)類自動聲明 componentN() 函數(shù),所以這里可以用解構(gòu)聲明。

注意:我們也可以使用標(biāo)準(zhǔn)類 Pair 并且讓 function() 返回 Pair<Int, Status>
但是讓數(shù)據(jù)合理命名通常更好。

例:解構(gòu)聲明和映射

可能遍歷一個映射(map)最好的方式就是這樣:

for ((key, value) in map) {
   // 使用該 key、value 做些事情
}

為使其能用,我們應(yīng)該

  • 通過提供一個 iterator() 函數(shù)將映射表示為一個值的序列,
  • 通過提供函數(shù) component1()component2() 來將每個元素呈現(xiàn)為一對。

當(dāng)然事實(shí)上,標(biāo)準(zhǔn)庫提供了這樣的擴(kuò)展:

operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator()
operator fun <K, V> Map.Entry<K, V>.component1() = getKey()
operator fun <K, V> Map.Entry<K, V>.component2() = getValue()

因此你可以在 for{: .keyword }-循環(huán)中對映射(以及數(shù)據(jù)類實(shí)例的集合等)自由使用解構(gòu)聲明。

下劃線用于未使用的變量(自 1.1 起)

如果在解構(gòu)聲明中你不需要某個變量,那么可以用下劃線取代其名稱:

val (_, status) = getResult()

在 lambda 表達(dá)式中解構(gòu)(自 1.1 起)

你可以對 lambda 表達(dá)式參數(shù)使用解構(gòu)聲明語法。
如果 lambda 表達(dá)式具有 Pair 類型(或者 Map.Entry 或任何其他具有相應(yīng) componentN 函數(shù)的類型)的參數(shù),那么可以通過將它們放在括號中來引入多個新參數(shù)來取代單個新參數(shù):

map.mapValues { entry -> "${entry.value}!" }
map.mapValues { (key, value) -> "$value!" }

注意聲明兩個參數(shù)和聲明一個解構(gòu)對來取代單個參數(shù)之間的區(qū)別:

{ a //-> …… } // 一個參數(shù)
{ a, b //-> …… } // 兩個參數(shù)
{ (a, b) //-> …… } // 一個解構(gòu)對
{ (a, b), c //-> …… } // 一個解構(gòu)對以及其他參數(shù)

如果解構(gòu)的參數(shù)中的一個組件未使用,那么可以將其替換為下劃線,以避免編造其名稱:

map.mapValues { (_, value) -> "$value!" }

你可以指定整個解構(gòu)的參數(shù)的類型或者分別指定特定組件的類型:

map.mapValues { (_, value): Map.Entry<Int, String> -> "$value!" }

map.mapValues { (_, value: String) -> "$value!" }