ZetCode

Kotlin 数据类

最后修改于 2024 年 1 月 29 日

在本文中,我们介绍了 Kotlin 数据类。

Kotlin 数据类 旨在保存数据。为此,不需要标准类的大部分高级功能。Groovy、F#、C# 语言有类似于 Kotlin 数据类的记录。

使用数据类,我们可以大大减少模板代码。编译器会自动创建 equalshashCodetoStringcopy 函数。

在 Kotlin 中,使用 data class 关键字创建数据类。

数据类必须遵循一些规则。主构造函数需要至少一个参数。所有主构造函数参数都必须标记为 val 或 var。数据类不能是抽象的、开放的、密封的或内部的。

Kotlin 数据类简单示例

以下是使用 Kotlin 数据类的简单示例。

Simple.kt
package com.zetcode

data class User(val fname: String, val lname: String, val occupation: String)

fun main() {

    val u = User("John", "Doe", "gardener")

    println(u.lname)
    println(u.fname)
    println(u.occupation)
    println(u)
}

我们定义了一个具有三个字段的 User 数据类。

data class User(val fname: String, val lname: String, val occupation: String)

定义数据类只需要一行代码。

println(u.lname)
println(u.fname)
println(u.occupation)

Kotlin 创建了三个属性。

println(u)

此外,我们定义了一个方便的 toString 方法,当我们将对象打印到控制台时,将调用该方法。

Doe
John
gardener
User(fname=John, lname=Doe, occupation=gardener)

无参数构造函数

如果生成的类需要一个无参数构造函数,则必须为属性指定默认值。

Parameterless.kt
package com.zetcode

data class Student(var name: String = "", var favCol: String = "")

fun main() {

    val s1 = Student()
    s1.name = "Paul"
    s1.favCol = "blue"
    println(s1)
}

为我们的 Student 构造函数提供默认值,我们可以创建一个具有空无参数构造函数的对象。

Kotlin 数据类复制

copy 函数用于复制一个对象,允许我们更改其某些属性,同时保持其余属性不变。

CopyFun.kt
package com.zetcode

data class User(val fname: String, val lname: String, val occupation: String)

fun main() {

    val u1 = User("John", "Doe", "gardener")
    val u2 = u1.copy(fname = "Jane", occupation = "teacher")

    println(u1)
    println(u2)

    println(u2.fname)
    println(u2.lname)
    println(u2.occupation)
}

使用 copy,我们可以快速创建一个共享 lname 属性的新用户。

User(fname=John, lname=Doe, occupation=gardener)
User(fname=Jane, lname=Doe, occupation=teacher)
Jane
Doe
teacher

Kotlin 数据类解构

Kotlin 数据类支持解构操作。它允许我们将对象属性提取到变量中。

Destructuring.kt
package com.zetcode

data class User(val fname: String, val lname: String, val occupation: String)

fun main() {

    val u = User("John", "Doe", "gardener")

    val (fname, lname, occupation) = u
    println("$fname $lname is a $occupation")
}

在示例中,我们将用户对象的三个属性解构为三个独立的变量。

John Doe is a gardener

Kotlin 数据类过滤

数据类非常适合数据分析。

Filter.kt
package com.zetcode

data class User(val fname: String, val lname: String, val salary: Int)

fun main() {

    val users = arrayOf(
        User("John", "Doe", 1230),
        User("Lucy", "Novak", 670),
        User("Ben", "Walter", 2050),
        User("Robin", "Brown", 2300),
        User("Amy", "Doe", 1250),
        User("Joe", "Draker", 1190),
        User("Janet", "Doe", 980),
        User("Albert", "Novak", 1930)
    )

    users.filter { it.salary < 1000 }.forEach { e -> println(e) }
}

在示例中,我们有一个用户列表。使用 filter,我们找出所有工资低于 1000 的用户。

User(fname=Lucy, lname=Novak, salary=670)
User(fname=Janet, lname=Doe, salary=980)

Kotlin Pair & Triple

Kotlin 提供了两个标准数据类:PairTriple

Standard.kt
package com.zetcode

fun main() {

    val p1 = Pair(1, 2)
    val p2 = Pair(3, 4)
    val p3 = Pair(p1.first + p2.first, p2.second + p2.second)

    println(p1)
    println(p2)
    println(p3)

    val t1 = Triple(1, 2, 3)
    val t2 = Triple(3, 4, 5)
    val t3 = Triple(t1.first + t2.first, t1.second + t2.second,
        t1.third + t2.third)

    println(t1)
    println(t2)
    println(t3)
}

我们可以使用 firstsecondthird 属性来获取它们的值。

(1, 2)
(3, 4)
(4, 8)
(1, 2, 3)
(3, 4, 5)
(4, 6, 8)

来源

Kotlin 数据类 - 语言参考

在本文中,我们介绍了 Kotlin 中的数据类。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 Kotlin 教程