亚洲区国产区激情区无码区,国产成人mv视频在线观看,国产A毛片AAAAAA,亚洲精品国产首次亮相在线

Kotlin 數(shù)據(jù)類(Data)

在本文中,您將學習在Kotlin中創(chuàng)建數(shù)據(jù)類。您還將了解數(shù)據(jù)類必須滿足的要求及其標準功能。

可能會出現(xiàn)這樣的情況: 您需要創(chuàng)建一個僅用于保存數(shù)據(jù)的類。在這種情況下,您可以將類標記為 data 以創(chuàng)建數(shù)據(jù)類。比如說,

data class Person(val name: String, var age: Int)

對于此類,編譯器會自動生成:

  • copy()函數(shù),equals()和hashCode()對以及主要構造函數(shù)的toString()形式

  • componentN() 函數(shù)

在詳細討論這些函數(shù)之前,讓我們討論數(shù)據(jù)類必須滿足的要求。

Kotlin 數(shù)據(jù)類的要求

要求如下:

  • 主構造函數(shù)必須至少具有一個參數(shù)。

  • 主構造函數(shù)的參數(shù)必須標記為val(只讀)或 var(讀寫)。

  • 類不能是開放的、抽象的、內(nèi)部的或密封的。

  • 該類可以擴展其他類或實現(xiàn)接口。 如果您使用的是1.1之前的Kotlin版本,則該類只能實現(xiàn)接口。

示例:Kotlin 數(shù)據(jù)類使用

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

fun main(args: Array<String>) {
    val jack = User("jack", 29)
    println("name = ${jack.name}")
    println("age = ${jack.age}")
}

運行該程序時,輸出為:

name = jack
age = 29

當您聲明一個數(shù)據(jù)類時,編譯器會在后臺自動生成幾個函數(shù),如toString()、equals()、hashcode()等。 這有助于保持代碼的簡潔性。 如果您使用Java,則需要編寫大量樣板代碼。
讓我們使用以下函數(shù):

copy() 函數(shù) - 復制

對于數(shù)據(jù)類,可以使用copy()函數(shù)創(chuàng)建具有不同屬性的對象副本。 它的工作原理如下:

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

fun main(args: Array<String>) {
    val u1 = User("John", 29)
   
    //使用復制函數(shù)創(chuàng)建對象
    val u2 = u1.copy(name = "Randy")

    println("u1: name = ${u1.name}, name = ${u1.age}")
    println("u2: name = ${u2.name}, name = ${u2.age}")
}

運行該程序時,輸出為:

u1: name = John, name = 29
u2: name = Randy, name = 29

toString()方法 - 返回字符串

toString()函數(shù)返回該對象的字符串表示形式。

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

fun main(args: Array<String>) {
    val u1 = User("John", 29)
    println(u1.toString())
}

運行該程序時,輸出為:

User(name=John, age=29)

hashCode() 和 equals()

hasCode() 方法返回對象的散列碼。 如果兩個對象相等,則hashCode()會產(chǎn)生相同的整數(shù)結果。

如果兩個對象相等(hashCode()相同),則equals()返回true。如果對象不相等,equals()返回false。

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

fun main(args: Array<String>) {
    val u1 = User("John", 29)
    val u2 = u1.copy()
    val u3 = u1.copy(name = "Amanda")

    println("u1 hashcode = ${u1.hashCode()}")
    println("u2 hashcode = ${u2.hashCode()}")
    println("u3 hashcode = ${u3.hashCode()}")

    if (u1.equals(u2) == true)
        println("u1 等于 u2.")
    else
        println("u1 不等于 u2.")

    if (u1.equals(u3) == true)
        println("u1 等于 u3.")
    else
        println("u1 不等于 u3.")
}

運行該程序時,輸出為:

u1 hashcode = 71750738
u2 hashcode = 71750738
u3 hashcode = 771732263
u1 等于 u2.
u1 不等于 u3.

解構聲明

您可以使用解構聲明將一個對象分解為多個變量。例如:

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

fun main(args: Array<String>) {
    val u1 = User("John", 29, "Male")

    val (name, age, gender) = u1
    println("name = $name")
    println("age = $age")
    println("gender = $gender")
}

運行該程序時,輸出為:

name = John
age = 29
gender = Male

這是可能的,因為編譯器會為數(shù)據(jù)類生成component()函數(shù)的所有屬性。 例如:

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

fun main(args: Array<String>) {
    val u1 = User("John", 29, "Male")

    println(u1.component1())     // John
    println(u1.component2())     // 29  
    println(u1.component3())     // "Male"
}

運行該程序時,輸出為:

John
29
Male