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. 数据类

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