美文网首页
Kotlin中的解构声明

Kotlin中的解构声明

作者: 盛世光阴 | 来源:发表于2021-06-12 23:15 被阅读0次

    前言

    Kotlin是一种在Java虚拟机上运行的静态类型编程语言,被称之为Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成为Android官方开发语言

    什么是解构声明

    把一个对象可以解构成多个对象的声明方式叫做解构声明

    解构声明的使用

    data class Person(val name: String, val age: Int)
    class Call{
        fun test(){
            val (name,age) = Person("Mike",28)
            println(name)
            println(age)
        }
    }
    

    其中(name,age)就是解构的声明方式,并且打印结果是

    Mike
    28
    

    结构声明只能在局部变量
    如果声明在成员变量会提示
    destructuring declarations are only allowed for local variables/values
    结构声明默认只支持data数据类对象,普通类不支持
    当我们使用解构声明时,编译器会生成这样的代码

    fun test(){
        val (name,age) = Person("Mike",28)
    }
    //编译后
    public final void test() {
        Person var3 = new Person("Mike", 28);
        String var1 = var3.component1();
        int age = var3.component2();
    }
    
    data class Person(val name: String, val age: Int)
    //编译后
    public final class Person {
        @NotNull
        private final String name;
        private final int age;
        public Person(@NotNull String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        @NotNull
        public final String component1() {
            return this.name;
        }
    
        public final int component2() {
            return this.age;
        }
    }
    

    name就相当于是component1()的返回值,age就相当于是component2()的返回值,并且这两个函数都是data class编译后直接产生的,所以可以可以直接使用解构的方式声明,普通类如果需要使用解构声明则需要手动定义这些函数

    class Person(val name: String,val age: Int){  
    operator fun component1(): String { return name }
    operator fun component2(): Int { return age }
    }
    class Call{
        fun test(){
            val (name,age) = Person("Mike",28)
        }
    }
    

    使用解构声明在循环和lambda中
    可以直接使用解构声明的方式接收元素

    fun test() {
        val persons = listOf<Person>(Person("张三", 11), Person("", 12), Person("Mike", 13))
    
        for ((name, age) in persons) {
        }
        persons.forEach { (name, age) ->
        }
    }
    

    用于函数返回多个变量

    data class CallResult(val errorCode:Int,val errorMsg:String)
    
    fun httpCall():CallResult{
        val errorCode = 500
        val errorMsg = "End of Stream"
        return CallResult(errorCode,errorMsg)
    }
    
    val (errorCode,errorMsg) = httpCall()
    

    解构中不使用的变量
    使用-表示不使用的变量,编译器则不会生成此变量

    val (name,_) = Person(“Mike”,28)
    

    注意点
    需要注意,在进行解构声明时,命名的位置会和数据类的变量位置对应,防止解构变量命名位置放反,造成不必要的麻烦

    data class Person(val name: String, val age: Int)
    fun test(){
        val (age,name) = Person(“Mike”,28)//位置放反使用起来会造成混淆
    }
    

    欢迎关注Mike的简书

    Android知识整理

    相关文章

      网友评论

          本文标题:Kotlin中的解构声明

          本文链接:https://www.haomeiwen.com/subject/nscweltx.html