30. 数据类

作者: 厚土火焱 | 来源:发表于2017-11-25 00:47 被阅读91次

数据类是什么呢?先看一个普通的类的例子。

class Country(val id:Int, val name:String)
fun main(args: Array<String>) {
    val China = Country(0, "中国")
    println(China)
}

运行看结果,我们希望它能输出 China 来。
但是...

com.cofox.kotlin.Country@511d50c0

我们看到的是这个。
有没有输出的办法呢?

println(China.id.toString() + China.name)

我们这样解决。
这样需要对每一参数写针对性代码。有没有更好的方法啊?用数据类。
修改 Country,在 Class 前面加 data

data class Country(val id:Int, val name:String)

输出的结果成了

Country(id=0, name=中国)

哦,很清晰啊!
这就是数据类。
那两个参数,可以按照顺序来输出。分别是 component1() component2()。如果有更多的参数,就一直递增下去。
我们可以这样输出

    println(China.component1())
    println(China.component2())

会输出

0
中国

China 中的数据,包含了顺序,我们甚至可以这样取出来

val(id,name) = China

然后你可以分别输出

    println(id)
    println(name)

结果还是会输出

0
中国

这种写法熟悉吗?以前见过的

    for ((index, value) in args.withIndex()){
        println(index)
        println(value)
    }

这是按照参数顺序打印出应用程序调用是给入的参数。
检查 withIndex 的源码


withIndex

看到 withIndex 又是从 IndexedValue 来的值,这又是什么呢?再追下去看看


IndexValue
IndexValue原来是个数据类 data class
IndexValue原来是数据类
这就是数据类的作用了。和我们写的 data class Country(val id:Int, val name:String) 是同样的东西。

这个 component 真是方便啊。这个可不是 data Class 专有的。我们自己的 Class 也可以有这个功能。
下面我来写一个月亮的变化,

class Moon{
    operator fun component1():String{
        return "今天初一"
    }
    operator fun component2():String{
        return "今天初二"
    }
    operator fun component3():String{
        return "今天初三"
    }
    operator fun component4():String{
        return "今天初四"
    }
    operator fun component5():String{
        return "今天初五"
    }
    operator fun component6():String{
        return "今天初六"
    }
}

难道只能是 String 类型么?当然不是。我们改一改。

class Moon{
    operator fun component1():String{
        return "你好,我是"
    }
    operator fun component2():Int{
        return 1
    }
    operator fun component3():Int{
        return 1
    }
    operator fun component4():Int{
        return 0
    }
    operator fun component5():Double{
        return 30.5
    }
    operator fun component6():String{
        return "岁的狙击手。"
    }
}

然后根据这6个参数写一个调用

    val(a,b,c,d,e,f) = Moon()
    println("$a$b$c$d$e$f")

它会输出

你好,我是11030.5岁的狙击手。

再回到我们的数据类的主题上来。
如果数据类的使用,每一个数据的写入都需要

val China = Country(0, "中国")

如果数据的元素多一些,而且每个数据还有很多重复的,需要一个简单一点的写法。我们可以用copy

    val China = Country(0, "中国")
    val USA = China.copy(name = "美国")
    val German = China.copy(name = "德国")
    val Japan = China.copy(name = "日本")
    val Russia = China.copy(name = "俄国")

这样,除了我们主动赋值的 name,其他元素会默认使用 China 的值。

println(Japan)

输出的是

Country(id=0, name=日本)

相关文章

  • 30. 数据类

    数据类是什么呢?先看一个普通的类的例子。 运行看结果,我们希望它能输出 China 来。但是... 我们看到的是这...

  • 30.包装类

    包装类 包装类即8种基本数据类型对应的引用类型基本数据类型引用数据类型byteByteshortShortintI...

  • Python相关题-数据类型

    数据类型 - 列表 30. 已知AList = [1, 2, 3, 1, 2],对AList列表元素去重,写出具体...

  • 2020-7-6晨间日记

    A day to say goodbye. 起床:5:30. 就寝:11:30. 天气:There are few...

  • 焱武记:Day 228(补记)

    1206 Thr met Jim Rogers. 11:00-12:30. PR 12:30-14:30. lat...

  • Kotlin基本语法之(六) 数据类data与单例类object

    数据类data data类是Kotlin中专门用来描述数据的类,数据类通常指的就是实体类(bean/entity)...

  • 《语言学概论》——考前密训——第四章 语言的结构规则——语法

    30.语法规则的性质和特点(单选、简答、论述)★ 抽象性 指的是对具体东西进行类的概括。 递归性 指的是相同的规则...

  • 数据类

    kotlin定义了一种 专门用于保存数据 的类——数据类,关键字为data class, 它有以下2个要求: 默认...

  • 数据类

    我们经常创建一些只保存数据的类。 在这些类中,一些标准函数往往是从数据机械推导而来的。在 Kotlin 中,这叫做...

  • Kotlin学习笔记之 9

    9.Kotlin 数据类与密封类 数据类在class前面加上data关键字,这个类就变成了数据类,会自动添加我们一...

网友评论

    本文标题:30. 数据类

    本文链接:https://www.haomeiwen.com/subject/jzjqbxtx.html