Kotlin - 数据类 data class、解构 componentN、copy

时间:2025-02-09 08:41:42

一、数据类 data class

我们经常会创建一些保存数据的类,Kotlin 使用 data 关键字声明一个数据类,解决 JavaBean 极其臃肿的写法。主构造中声明的属性会默认创建以下函数(在类体中声明的属性不会生成):

  • equals()、hashCode()
  • toString(),格式是:User(name=张三, age=18)
  • componentN(),按声明顺序对应所有属性
  • copy()
data class User(
    var id: Long,
    var name: String,
    var age: Int
) : Person() {
    var gender : Boolean = false    //类中声明的属性不会自动生成
}

//创建实例
val user = User(123456, "张三", 18)
//通常取出数据
val id = 
//使用解构一次声明多个变量
var (_, name, age) = user    //必须按顺序声明,可以使用下划线忽略不需要的属性
//使用变量
name = "李四"
println(name)   //打印:李四
println(age)    //打印:18

//再想创建一个User只改变年龄
val user2 = (age = 31)
println(user)   //打印:User(id=123456, name='张三', age=18)
println(user2)  //打印:User(id=123456, name='张三', age=31)

解构 componentN( )

就是把一个对象的属性一次性拆分成多个变量。数据类默认生成 componentN() 函数,N对应主构造中属性的个数。普通类也可以使用解构,需要自行手动声明 operator componentN() 函数。 

class User(
    var id: Long,
    var name: String,
    var age: Int
) {
    operator fun component1() = id
    operator fun component2() = name
    operator fun component3() = age
}

val user = User(123456, "张三", 18)
val id = 
var (_, name, age) = user    //必须按顺序声明,可以使用下划线忽略不需要的属性
name = "李四"
println(name)   //打印:李四
println(age)    //打印:18

复制 copy( )

很多情况下,我们需要复制一个对象,只改变部分数据而其它保持不变,就可以使用 copy() 函数。

class User(
    var id: Long,
    var name: String,
    var age: Int
) {
    fun copy(
        id: Long = ,
        name: String = ,
        age: Int = 
    ) = User(
        id = id,
        name = name,
        age = age
    )
}

val aa = User(123,"张三",18)
val bb = (name = "李四")
println("${},${},${}")    //打印:123,张三,18
println("${},${},${}")    //打印:123,李四,18