数据类是什么呢?先看一个普通的类的例子。
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=日本)
网友评论