Kotlin-9-解构

目录

1、解构的定义

2、operator

3、解构的实现

4、数据类自动解构

5、使用场景

6、小技巧


1、解构的定义

解构的意思就是将一个被初始化的对象,将它们的属性按顺序解构出来。

2、operator

  • 定义:opetator的作用就是将一个函数标记为重载一个操作符
  • 使用:componentN是操作符,重载它,必须添加operator修饰符

3、解构的实现

下面我定义了一个Animal的类,它的属性,分别是name,age,height。

如果想将一个person对象的属性解构出来的话,必须使用component1()操作符将属性值解构出来。

component1(),component2()等函数是Kotlin约定的操作符(类似+ - * / for等操作符)

class Animal(val name: String, val age: Int) {
    var height:Int = 0
    operator fun component1(): String = name
    operator fun component2(): Int = age
    operator fun component3(): Int = height
}

解构出来的结果


fun main() {

    val animal = Animal("小白", 3)
    animal.height=120
    //解构语句
    val (animalName: String, animalAge: Int,animalHeight) = animal

    println("animalName=$animalName")
    println("animalAge=$animalAge")
    println("animalHeight=$animalHeight")

}

//输出结果
animalName=小白
animalAge=3
animalHeight=120

4、数据类自动解构

编译器会为数据类(data class)自动声明/定义componentN()函数,可直接用解构声明!

data class Dog(val name: String, val age: Int)


fun main() {

    val dog = Dog("小黑", 2)
    //解构语句
    val (dogName: String, dogAge: Int) = dog

    println("dogName=$dogName")
    println("dogAge=$dogAge")

}

//输出结果

dogName=小黑
dogAge=2

5、使用场景

  • 如果需要一个函数返回多个变量,Kotlin最简洁的实现是声明一个可解构的类(或者数据类)并将其返回。然后在解构出多个变量
fun returnName_Age(name: String): Dog {
    val dog = Dog(name, 10)
    return dog
}
  • 遍历集合(可以直接将所有属性直接解构出来,方便使用)
    var dogList= mutableListOf<Dog>()

    for ((name, age) in dogList) {
        println("dogName=$dogName")
        println("dogAge=$dogAge")
    }
  • lambda表达式中的解构声明

lambda 表达式中的参数类型可以有许多种,如果这些参数类型为 Pair类型、Map.Entry 或任何其他具有相应 componentN 函数的类型,那么可以通过将它们放在括号中实现一个可以被解构的参数。

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!" }

6、小技巧

  • 除了用解构语句将对象属性解构出来输出以外,还可以直接调用被解构对象的componentN操作符将你想要的属性输出出来

    val dog = Dog("小黑", 2)

    val (dogName: String, dogAge: Int) = dog

    println("dogName=$dogName")
    println("dogName=${dog.component1()}")//和上面的输出结果一样
  • 解构出来的对象属性与componentN的组件函数的顺序是对应的,而默认的component的顺序是属性的声明的顺序。
class Animal(val name: String, val age: Int) {
    var height: Int = 0
    operator fun component1(): String = name
    operator fun component2(): Int = age
    operator fun component3(): Int = height
}
//解构的属性顺序和component1、component2、component3的顺序是一样的
 val (animalName: String, animalAge: Int, animalHeight) = animal
  • 解构出来的对象属性,有未使用到的变量可以使用“_”下划线来代替。
class Animal(val name: String, val age: Int) {
    var height: Int = 0
    operator fun component1(): String = name
    operator fun component2(): Int = age
    operator fun component3(): Int = height
}
//如果你不需要age属性,可以用_代替
 val (animalName: String,_, animalHeight) = animal
发布了82 篇原创文章 · 获赞 16 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/qq_34589749/article/details/103551177