Kotlin - 数据类

Kotlin - 数据类 首页 / Kotlin入门教程 / Kotlin - 数据类

数据类是一个简单的类,用于保存数据/状态并包含标准函数。 data关键字用于将一个类声明为数据类。

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

声明一个数据类必须至少包含一个带有属性参数(val或var)的主构造函数。

数据类内部包含以下函数:

  • equals(): Boolean
  • hashCode(): Int
  • toString(): String
  • component() 
  • copy()

Java数据类和Kotlin数据类之间区别

如果要使用数据类在Java中创建用户条目,则需要大量数据。

import java.util.Objects;

public class User {
    private String name;
    private int id;
    private String email;

    public User(String name, int id, String email) {
        this.name = name;
        this.id = id;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public intgetId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
         this.email = email;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof User)) return false;
        User user = (User) o;
        return getId() == user.getId() &&
        Objects.equals(getName(), user.getName()) &&
        Objects.equals(getEmail(), user.getEmail());
    }

    @Override
    public inthashCode() {
        return Objects.hash(getName(), getId(), getEmail());
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", email='" + email + '\'' +
                '}';
    }
}

使用用户类的对象调用上述Java数据类的构造函数

class MyClass{
    public static void main(String agrs[]){
        User u = new User("Ashu",101,"mymail@mail.com");
        System.out.println(u);
    }
}

输出:

User{name='Ashu', id=101, email='mymail@mail.com'}

以上java数据类代码在单行中以kotlin数据代码重写为

data class User(var name: String, var id: Int, var email: String)

使用用户类的对象调用kotlin数据类的构造函数

fun main(agrs: Array<String>) {
  val u = User("Ashu", 101, "mymail@mail.com")
  println(u)
}

输出:

User(name=Ashu, id=101, email=mymail@mail.com)

数据类toString()方法

Kotlin数据类仅关注数据,而不关注代码实现。

让无涯教程看一个没有数据类的简单程序。在此类中,无涯教程尝试使用其对象打印Product类的引用。

无涯教程网

class Product(varitem: String, var price: Int)

fun main(agrs: Array<String>) {
  val p = Product("laptop", 25000)
  println(p)
}

在打印产品类的引用时,它将显示带有产品类名称的hashCode()。它不打印数据。

输出:

Product(name=laptop, price=25000)

使用数据类重写上述程序,并打印产品类的引用并显示对象的数据。发生这种情况是因为数据类内部包含toString(),该toString()显示object的字符串表示形式。

data class Product(varitem: String, var price: Int)

fun main(agrs: Array<String>) {
  val p = Product("laptop", 25000)
  println(p)
}

输出:

Product(name=laptop, price=25000)

数据classequals()和hashCode()

equal()方法用于检查其他对象是否“等于”当前对象。在两个或多个hashCode()之间进行比较时,如果hashCode()相等,则equals()方法返回true,否则返回false。

链接:https://www.learnfk.comhttps://www.learnfk.com/kotlin/kotlin-data-class.html

来源:LearnFk无涯教程网

例如,让无涯教程看一个示例,其中一个普通类将具有相同数据的相同类Product的两个引用进行比较。

class Product(varitem: String, var price: Int)

fun main(agrs: Array<String>) {
  val p1 = Product("laptop", 25000)
  val p2 = Product("laptop", 25000)
  println(p1==p2)
  println(p1.equals(p2))
}

在上面的程序中,参考p1和参考p2具有不同的参考。由于p1和p2中的参考值不同,进行比较显示为false。

输出:

true
true

使用数据类重写以上程序,打印产品类的引用并显示对象的数据。

hashCode()方法返回对象的哈希码。如果两个对象相等,则hashCode()会产生相同的整数结果。

data class Product(varitem: String, var price: Int)

fun main(agrs: Array<String>) {
  val p1 = Product("laptop", 25000)
  val p2 = Product("laptop", 25000)
  println(p1==p2)
  println(p1.equals(p2))
}

输出:

true
true

数据类copy()方法

数据类提供了copy()方法,该方法用于创建对象的副本。使用copy()方法,可以更改对象的某些或全部属性。

例如:

data class Product(var item: String, var price: Int)

fun main(agrs: Array<String>) {
  val p1 = Product("laptop", 25000)
  println("p1 object contain data : $p1")
  val p2 = p1.copy()
  println("p2 copied object contains default data of p1: $p2")
  val p3 = p1.copy(price = 20000)
  println("p3 contain altered data of p1 : $p3")
}

输出:

p1 object contain data : Product(item=laptop, price=25000)
p2 copied object contains default data of p1: Product(item=laptop, price=25000)
p3 contain altered data of p1 : Product(item=laptop, price=20000)

默认参数和命名参数

无涯教程还可以在数据类的主构造函数中分配默认参数。如果需要,可以在以后的程序中更改这些默认值。

例如:

data class Product(var item: String = "laptop", var price: Int = 25000)

fun main(agrs: Array<String>) {
  val p1 = Product(price = 20000)
  println(p1)
}

输出:

Product(item=laptop, price=20000)

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

人工智能基础课 -〔王天一〕

图解 Google V8 -〔李兵〕

SRE实战手册 -〔赵成〕

etcd实战课 -〔唐聪〕

恋爱必修课 -〔李一帆〕

如何成为学习高手 -〔高冷冷〕

搞定音频技术 -〔冯建元 〕

超级访谈:对话汤峥嵘 -〔汤峥嵘〕

手把手带你写一个MiniSpring -〔郭屹〕

好记忆不如烂笔头。留下您的足迹吧 :)