Kotlin专题Kotlin编程禅与计算机程序设计艺术

30. 数据类

2017-11-25  本文已影响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=日本)
上一篇 下一篇

猜你喜欢

热点阅读