Kotlin中的解构声明

2021-06-12  本文已影响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知识整理

上一篇 下一篇

猜你喜欢

热点阅读