Kotlin学习系列——数据类

一时失言乱红尘 2023-06-25 10:29 78阅读 0赞

Kotlin数据类 data class

  • 使用关键字data class 创建一个只包含数据的类

    data class DataClass(val userName: String, val pwd: String) {
    }

  1. 1
  2. 2

反编译之后的java代码如下所示

  1. public final class DataClass {
  2. @NotNull
  3. private final String userName;
  4. @NotNull
  5. private final String pwd;
  6. @NotNull
  7. public final String getUserName() {
  8. return this.userName;
  9. }
  10. @NotNull
  11. public final String getPwd() {
  12. return this.pwd;
  13. }
  14. public DataClass(@NotNull String userName, @NotNull String pwd) {
  15. Intrinsics.checkParameterIsNotNull(userName, "userName");
  16. Intrinsics.checkParameterIsNotNull(pwd, "pwd");
  17. super();
  18. this.userName = userName;
  19. this.pwd = pwd;
  20. }
  21. @NotNull
  22. public final String component1() {
  23. return this.userName;
  24. }
  25. @NotNull
  26. public final String component2() {
  27. return this.pwd;
  28. }
  29. @NotNull
  30. public final DataClass copy(@NotNull String userName, @NotNull String pwd) {
  31. Intrinsics.checkParameterIsNotNull(userName, "userName");
  32. Intrinsics.checkParameterIsNotNull(pwd, "pwd");
  33. return new DataClass(userName, pwd);
  34. }
  35. // $FF: synthetic method
  36. // $FF: bridge method
  37. @NotNull
  38. public static DataClass copy$default(DataClass var0, String var1, String var2, int var3, Object var4) {
  39. if ((var3 & 1) != 0) {
  40. var1 = var0.userName;
  41. }
  42. if ((var3 & 2) != 0) {
  43. var2 = var0.pwd;
  44. }
  45. return var0.copy(var1, var2);
  46. }
  47. public String toString() {
  48. return "DataClass(userName=" + this.userName + ", pwd=" + this.pwd + ")";
  49. }
  50. public int hashCode() {
  51. return (this.userName != null ? this.userName.hashCode() : 0) * 31 + (this.pwd != null ? this.pwd.hashCode() : 0);
  52. }
  53. public boolean equals(Object var1) {
  54. if (this != var1) {
  55. if (var1 instanceof DataClass) {
  56. DataClass var2 = (DataClass)var1;
  57. if (Intrinsics.areEqual(this.userName, var2.userName) && Intrinsics.areEqual(this.pwd, var2.pwd)) {
  58. return true;
  59. }
  60. }
  61. return false;
  62. } else {
  63. return true;
  64. }
  65. }
  66. }
  • 编译器会根据主构造函数生命的属性自动创建以下三个函数
  • equals()、hashCode、toString()
  • component1()、component2()返回对应下标位置的属性值,按照声明顺序排列
  • copy()函数:根据旧对象重新new一个对象出来。
  • 如果以上函数在类中已经被定义,或者其超类中继承,则编译器将不会生成

数据类语法限制

  • 主构造函数至少含有一个参数
  • 参数必须用val或者var标识
  • 不能为abstract、open、sealed、inner
  • 不能继承其他的类、但是可以实现接口
    另外数据类可以在解构声明中使用

    @JvmStatic

    1. fun main(args: Array<String>) {
    2. val dataClass = DataClass("LL", "123456")
    3. val (username, pwd) = dataClass
    4. println("${username} " + "---" + " ${pwd}")
    5. }
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6

Pair 和 Triple

Kotlin标准库提供了Pari和Triple数据类,分别表示二元组和三元组对象。

  • Pari

    // 泛型作为内部方法的返回,那么可以用 out
    // 泛型对象作为函数的参数,那么可以用 in
    data class DataClass(private val userName: A, private val pwd: B) {

    1. override fun toString(): String {
    2. return "userName = " + userName + " userpwd = " + pwd
    3. }

    }

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9

创建DataClass的时候,只能是二元组的参数
或者创建一个Pari 或者 Triple

  1. val pair = Pair<Int, String>(12, "hello")
  2. println(pair)
  3. println(pair.first)
  4. println(pair.second)
  5. val triple = Triple<String, String, Int>("zhang", "男", 12)
  6. println(triple.first)
  7. 1
  8. 2
  9. 3
  10. 4
  11. 5
  12. 6
  13. 7

或者创建一个Map

  1. var map = mapOf(1 to "A", 2 to "B", 3 to "C")
  2. println(map)
  3. 1
  4. 2

输出结果

  1. {1=A, 2=B, 3=C}
  2. 1
  • Triple 使用也差不多

    data class DataClass(private val userName: A, private val pwd: B, private val sex: C)

  1. 1
复制

复制使用 copy() 函数,我们可以使用该函数复制对象并修改部分属性, 对于上文的 User 类,其实现会类似下面这样:

  1. fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

实例
使用 copy 类复制 User 数据类,并修改 age 属性:

  1. data class User(val name: String, val age: Int)
  2. fun main(args: Array<String>) {
  3. val jack = User(name = "Jack", age = 1)
  4. val olderJack = jack.copy(age = 2)
  5. println(jack)
  6. println(olderJack)
  7. }

输出结果为:

  1. User(name=Jack, age=1)
  2. User(name=Jack, age=2)
数据类以及解构声明

组件函数允许数据类在解构声明中使用:

  1. val jane = User("Jane", 35)
  2. val (name, age) = jane
  3. println("$name, $age years of age") // prints "Jane, 35 years of age"
标准数据类

标准库提供了 Pair 和 Triple 。在大多数情形中,命名数据类是更好的设计选择,因为这样代码可读性更强而且提供了有意义的名字和属性。

发表评论

表情:
评论列表 (有 0 条评论,78人围观)

还没有评论,来说两句吧...

相关阅读