Kotlin-25.解构声明(Destructuring Declaration)

来源:互联网 发布:手机淘宝里怎么开网店 编辑:程序博客网 时间:2024/05/02 01:04

官方文档: http://kotlinlang.org/docs/reference/multi-declarations.html

1.解构声明的概念和作用(destructuring declaration)

把一个对象成员解构(destructure)成多个变量,称为解构声明(destructuring declaration),component1(),component2()等函数是Kotlin约定的操作符(类似+ - * / for等操作符)componentN是操作符(类似加减乘除的运算符),重载操作符必需要用operator修饰以允许使用!解构声明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"    }

1.数据类(data class)

编译器会为数据类(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()}")    }

2.函数返回多个变量(Return Values)

如果需要一个函数返回多个变量,Kotlin最简洁的实现是声明一个数据类并返回其实例对象,数据类(data class)自动声明/定义componentN()函数,无需我们定义!    data class Result(val result: Int, val status: Status)    fun deFun(...): Result {        return Result(result, status)    }    //函数直接返回多个变量,非常方便使用    val (result, status) = deFun(...)

3.for循环-解构声明

collection的元素类必须要声明component1()、component2()等函数    for ((a, b) in collection) {        print(a)          ...                    }

4.映射Map-解构声明

在kotlin标准库(standard library)提供以下扩展:    //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()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")        }    }

2.自kotlin 1.1起的新特性

1.下划线_未使用变量(Underscore unused)    如果在解构声明中不需要使用某个变量,那么可用下划线_取代:        val (_, status) = getResult()2.lambda表达式参数解构(Destructuring Lambda)        如果lambda表达式参数类型是Pair/Map.Entry或具有componentN函数的类型,    那么lambda表达式参数可以使用解构声明:        map.mapValues { entry -> "${entry.value}!" }        map.mapValues { (key, value) -> "$value!" }    多个参数和一个解构的区别:        { a -> …… } //一个参数        { a, b -> …… } //两个参数        { (a, b) -> …… } //一个解构对        { (a, b), c -> …… } //一个解构对,一个参数    解构的参数未使用,用下划线取代,以免编造新名:        map.mapValues { (_, value) -> "$value!" }    可以指定解构的参数类型:        map.mapValues { (_, value): Map.Entry<Int, String> -> "$value!" }        map.mapValues { (_, value: String) -> "$value!" }

简书:http://www.jianshu.com/p/8f7cb57f4009
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/74078507
GitHub博客:http://lioil.win/2017/07/01/Kotlin-destructure.html
Coding博客:http://c.lioil.win/2017/07/01/Kotlin-destructure.html

阅读全文
0 0
原创粉丝点击