<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 解構聲明(destructuring declaration) [TOC] 有時**把一個對象解構成很多變量**會很方便,例如: ```kotlin val (name, age) = person ``` 這種語法稱為**解構聲明** 。**一個解構聲明同時創建多個變量**。我們已經聲明了兩個新變量: `name` 和 `age`,并且**可以獨立使用它們**: ```kotlin println(name) println(age) ``` 一個解構聲明會被編譯成以下代碼: ```kotlin val name = person.component1() val age = person.component2() ``` 其中的 `component1()` 和 `component2()` 函數是在 Kotlin 中廣泛使用的**約定原則**的另一個例子。(參見像 `+` 和 `*`、*for*循環等操作符)。 任何表達式都可以出現在解構聲明的右側,只要可以對它調用所需數量的 component 函數即可。當然,可以有 `component3()` 和 `component4()` 等等。 >[success]請注意,`componentN()` 函數需要用 `operator` 關鍵字標記,以允許在解構聲明中使用它們。componentN是操作符(類似加減乘除的運算符),重載操作符必需要用operator修飾以允許使用!如下面的示例。 解構聲明也可以用在 *for*循環中:當你寫: ```kotlin for ((a, b) in collection) { …… } ``` 變量 `a` 和 `b` 的值取自對集合中的元素上調用 `component1()` 和 `component2()` 的返回值。 ## 解構聲明componentN函數的定義 如下: ``` class User(val first: String, val second: String) { //componentN是操作符,重載它,必須添加operator修飾符 operator fun component1(): String { return first } operator fun component2(): String { return second } } fun main(args: Array<String>) { //解構聲明會創建多個變量,可獨立使用 val (f, s) = User("lioil", "win") println("$f, $s") //輸出"lioil", "win" } ``` ## 例:從函數中返回兩個變量(函數返回多個變量(Return Values)) 讓我們假設我們需要從一個函數返回兩個東西。例如,一個結果對象和一個某種狀態。在 Kotlin 中一個簡潔的實現方式是聲明一個[數據類](http://www.kotlincn.net/docs/reference/data-classes.html) 并返回其實例: ```kotlin data class Result(val result: Int, val status: Status) fun function(……): Result { // 各種計算 return Result(result, status) } // 現在,使用該函數: val (result, status) = function(……) ``` **因為數據類自動聲明 `componentN()` 函數,所以這里可以用解構聲明**。 >[info]**注意**:我們也可以使用標準類 `Pair` 并且讓 `function()` 返回 `Pair<Int, Status>`,但是讓數據合理命名通常更好。 ### 數據類 **編譯器會為數據類(data class)自動聲明/定義componentN()函數,可直接用解構聲明**! ``` data class User(val name: String, val id: Int) fun main(args: Array<String>) { val u = User("lioil.win", 1) //傳統用法 println("${u.name}, ${u.id}")//輸出: lioil.win, 1 //解構聲明 val (n, i) = u println("$n, $i")//輸出: lioil.win, 1 //直接調用componentN函數 println("${u.component1()}, ${u.component2()}")//輸出: lioil.win, 1 } ``` ## 例:解構聲明和映射 可能遍歷一個映射(map)最好的方式就是這樣: ```kotlin for ((key, value) in map) { // 使用該 key、value 做些事情 } ``` 為使其能用,我們應該 * 通過提供一個 `iterator()` 函數將映射表示為一個值的序列; * 通過提供函數 `component1()` 和 `component2()` 來將每個元素呈現為一對。 當然事實上,**標準庫提供了這樣的擴展**: ```kotlin //iterator()用于map迭代遍歷(循環) operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator() //component1、component2用于解構Map.Entr對象,獲取鍵值對(key,value) operator fun <K, V> Map.Entry<K, V>.component1() = getKey() operator fun <K, V> Map.Entry<K, V>.component2() = getValue() ``` 因此你可以在 *for*循環中對映射(以及數據類實例的集合等)自由使用解構聲明。 ### for循環-解構聲明 collection的元素類必須要聲明component1()、component2()等函數 ``` for ((a, b) in collection) { print(a) ... } ``` ### Map解構聲明的實例: ``` fun main(args: Array<String>) { val map = hashMapOf<String, Int>() map.put("one", 1) map.put("two", 2) //(key, value) in map for ((key, value) in map) { println("key = $key, value = $value") } } ``` 運行結果: ``` key = one, value = 1 key = two, value = 2 ``` ## 下劃線用于未使用的變量(自 1.1 起) **如果在解構聲明中你不需要某個變量,那么可以用下劃線取代其名稱**: ```kotlin val (_, status) = getResult() ``` 對于以這種方式跳過的組件,不會調用相應的 `componentN()` 操作符函數。 ## 在 lambda 表達式中解構(自 1.1 起) 你可以對 lambda 表達式參數使用解構聲明語法。**如果 lambda 表達式具有 `Pair` 類型(或者 `Map.Entry` 或任何其他具有相應 `componentN` 函數的類型)的參數**,那么可以通過將它們放在括號中來引入多個新參數來取代單個新參數,即**lambda表達式參數可以使用解構聲明**: ```kotlin map.mapValues { entry -> "${entry.value}!" } map.mapValues { (key, value) -> "$value!" } ``` >[info]注意:**聲明兩個參數和聲明一個解構對來取代單個參數之間**的區別: ```kotlin { a //-> …… } // 一個參數 { a, b //-> …… } // 兩個參數 { (a, b) //-> …… } // 一個解構對 { (a, b), c //-> …… } // 一個解構對以及其他參數 ``` **如果解構的參數中的一個組件未使用,那么可以將其替換為下劃線,以避免編造其名稱**: ```kotlin map.mapValues { (_, value) -> "$value!" } ``` **可以指定解構的參數類型**: 你可以指定**整個解構的參數的類型**或者**分別指定特定組件的類型**: ```kotlin map.mapValues { (_, value): Map.Entry<Int, String> -> "$value!" } map.mapValues { (_, value: String) -> "$value!" } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看