原文: https://beginnersbook.com/2019/03/kotlin-data-class/

在 Kotlin 中,您可以创建一个data类来保存数据。您希望将类标记为data的原因是让编译器知道您正在创建此类来保存数据,然后编译器会自动为您的数据类创建多个函数,这将有助于管理数据。在本指南中,我们将学习数据类和编译器自动生成的函数。

数据类学生:

  1. data class Student(val stuName: String, val stuAge: Int)

在 Kotlin 中自动生成数据类的函数

现在我只是在这里提到函数的名称,我们将在示例的帮助下看到它们中的每一个。

  1. equals()
  2. hashCode()
  3. toString()
  4. copy()
  5. componentN()

Kotlin 数据类要求

为了将类标记为数据,该类必须满足某些要求。要求如下:

  1. 数据类的主构造函数必须至少有一个参数。此外,参数标记为valvar
  2. 类不能标记为开放,抽象,密封或内部。
  3. 该类可以扩展(继承)其他类,它还可以实现其他接口。

Kotlin 数据类示例

在下面的示例中,我们有一个Student类,我们将其标记为数据类。由于我们已将此类声明为data,因此编译器已自动为此类生成了多个函数,如copy()toString()equals()等,我们将在接下来的几个示例中讨论这些函数。

  1. data class Student(val name: String, val age: Int)
  2. fun main(args: Array<String>) {
  3. val stu = Student("Chaitanya", 31)
  4. val stu2 = Student("Ajeet", 30)
  5. println("Student Name is: ${stu.name}")
  6. println("Student Age is: ${stu.age}")
  7. println("Student Name is: ${stu2.name}")
  8. println("Student Age is: ${stu2.age}")
  9. }

输出:

Kotlin 数据类 - 图1

数据类hashCode()equals()方法

如果两个对象在 kotlin 中相同,那么它们具有相同的哈希码,我们可以使用hashCode()方法获得。

方法equals()返回truefalse。如果两个对象的hashCode()相等,则equals()返回true,否则返回false

  1. data class Student(val name: String, val age: Int)
  2. fun main(args: Array<String>) {
  3. val stu = Student("Chaitanya", 31)
  4. val stu2 = Student("Chaitanya", 31)
  5. val stu3 = Student("Ajeet", 30)
  6. if (stu.equals(stu2) == true)
  7. println("stu is equal to stu2.")
  8. else
  9. println("stu is not equal to stu2.")
  10. if (stu.equals(stu3) == true)
  11. println("stu is equal to stu3.")
  12. else
  13. println("stu is not equal to stu3.")
  14. println("Hashcode of stu: ${stu.hashCode()}")
  15. println("Hashcode of stu2: ${stu2.hashCode()}")
  16. println("Hashcode of stu3: ${stu3.hashCode()}")
  17. }

输出:

Kotlin 数据类 - 图2

数据类copy()方法

通过在数据类中使用copy()方法,我们可以复制其他对象的一些属性。让我们举个例子。这里我们有一个Student类的对象stu,其中包含学生"Steve"的名称,年龄和主题细节,我们创建了另一个名为"Lucy"的对象stu2并使用数据类的copy()方法,复制了stu对象的年龄和主题细节。

  1. data class Student(val name: String, val age: Int, val sub: String)
  2. fun main(args: Array<String>) {
  3. val stu = Student("Steve", 26, "Math")
  4. // copying the age and subject from object stu
  5. val stu2 = stu.copy(name = "Lucy")
  6. println("stu: Name ${stu.name}, Age ${stu.age} & Subject ${stu.sub}")
  7. println("stu2: Name ${stu2.name}, Age ${stu2.age} & Subject ${stu2.sub}")
  8. }

输出:

Kotlin 数据类 - 图3

数据类toString()方法

data类的toString()方法返回对象的String表示形式。

  1. data class Student(val name: String, val age: Int, val sub: String)
  2. fun main(args: Array<String>) {
  3. val stu = Student("Steve", 26, "Math")
  4. println(stu.toString())
  5. }

输出:

  1. Student(name=Steve, age=26, sub=Math)

数据类component()方法

数据类的componentN()方法将对象解构为多个变量。在下面的例子中,我们有一个Student类的对象stu,我们使用componentN()方法将对象解构为变量。component1()方法返回对象的第一个属性的值,component2()返回第二个属性的值,依此类推。

  1. data class Student(val name: String, val age: Int, val sub: String)
  2. fun main(args: Array<String>) {
  3. val stu = Student("Steve", 26, "Math")
  4. val name = stu.component1()
  5. val age = stu.component2()
  6. val sub = stu.component3()
  7. println("Name is: $name")
  8. println("Age is: $age")
  9. println("SUbject is: $sub")
  10. }

输出:

Kotlin 数据类 - 图4