笔记:kotlin 学习第六天

  1. StandClass

    /**
     * @ 文件名:   StandClass
     * @ 创建者:   ty
     * @ 时间:    2018/8/2 09:14
     * @ 描述:    实例化用户的姓名年龄地址信息
     */
    fun main(args: Array<String>) {
    
        val person = Person("林青霞", 29, Address("深圳市", "宝安区", 10086))
        println(person.address.city + person.address.street + person.address.number)
    }
    
    class Address(var city: String, var street: String, var number: Int)
    
    data class Person(var name: String, var age: Int, var address: Address)
    
  1. DSLClass

    /**
     * @ 文件名:   `02.DSLClass`
     * @ 创建者:   ty
     * @ 时间:    2018/8/2 09:15
     * @ 描述:    完成以下效果
    
     * 第一步:实现person函数,参数以及返回值,Person,Address初始化不能有参数。
     * 第二步:实现字段属性可以添加person对象,接收者为Person对象的函数
     * 第三步:执行block函数
    
     *  person{
     *      name = "徐熊丽"
     *      age = 20
     *      address{
     *          city = "深圳市"
     *          street = "宝安街道"
     *          number = 114
     *      }
     *  }
     */
    
    
    fun main(args: Array<String>) {
        val person = person {
            name = "林青霞"
            age = 29
            address {
                city = "深圳市"
                street = "新安街道"
                number = 10000
            }
        }
    
        println(person.name + person.age)
    
    }
    
    fun address(block: Address.() -> Unit): Address {
        /*val address = Address()
        block(address)
        return address*/
        return Address().apply(block)
    }
    
    fun person(block: Person.() -> Unit): Person {
    
        /*val person = Person()
    
        block(person)
    
        return person*/
    
        return Person().apply(block)
    }
    
    class Address(var city: String? = null, var street: String? = null, var number: Int? = null)
    
    data class Person(var name: String? = null, var age: Int? = null, var address: Address? = null)
    
  1. DSLHtml

    /**
     * @ 文件名:   `03.DSLHtml`
     * @ 创建者:   ty
     * @ 时间:    2018/8/2 09:16
     * @ 描述:    完成如下效果
     *
     *  html{
     *       head{
     *           title{
     *
     *           }
     *       }
     *       body{
     *           div{
     *
     *           }
     *       }
     *   }
     */
    
    fun main(args: Array<String>) {
        val html = html {
            head {
                title {
    
                }
            }
            body {
                div {
    
                }
            }
        }
    
        println(html)
    
    }
    
    fun Body.div(block: () -> Unit) {
        val div = Div()
        setTag(div)
    }
    
    fun Head.title(block: () -> Unit) {
        val title = Title()
        setTag(title)
    }
    
    fun Html.body(block: Body.() -> Unit) {
        val body = Body()
        body.block()
        setTag(body)
    }
    
    fun Html.head(block: Head.() -> Unit) {
        val head = Head()
        head.block()
        setTag(head)
    }
    
    fun html(block: Html.() -> Unit): Html {
        val html = Html()
        html.block()
        return html
    }
    
    open class Tag(var name: String) {
        private val list = ArrayList<Tag>()
    
        fun setTag(tag: Tag) {
            list.add(tag)
        }
    
        override fun toString(): String {
            val sb = StringBuilder()
            sb.append("<$name>")
            list.forEach {
                sb.append(it.toString())
            }
            sb.append("</$name>")
            return sb.toString()
        }
    }
    
    
    class Html : Tag("Html")
    
    class Head : Tag("Head")
    
    class Body : Tag("Body")
    
    class Title : Tag("Title")
    
    class Div : Tag("Div")
    
  1. DSLHtml_缩小作用域

    /**
     * @ 文件名:   `04.DSLHtml_缩小作用域`
     * @ 创建者:   ty
     * @ 时间:    2018/8/2 09:20
     * @ 描述:    
     *       @DslMarker
     *       annotation class TAG
     */
    fun main(args: Array<String>) {
        val html = html {
            head {
                title {
    
                }
            }
            body {
                div {
    
                }
            }
        }
    
        println(html)
    
    }
    
    fun Body.div(block: () -> Unit) {
        val div = Div()
        setTag(div)
    }
    
    fun Head.title(block: () -> Unit) {
        val title = Title()
        setTag(title)
    }
    
    fun Html.body(block: Body.() -> Unit) {
        val body = Body()
        body.block()
        setTag(body)
    }
    
    fun Html.head(block: Head.() -> Unit) {
        val head = Head()
        head.block()
        setTag(head)
    }
    
    fun html(block: Html.() -> Unit): Html {
        val html = Html()
        html.block()
        return html
    }
    
    @TAG
    open class Tag(var name: String) {
        private val list = ArrayList<Tag>()
    
        fun setTag(tag: Tag) {
            list.add(tag)
        }
    
        override fun toString(): String {
            val sb = StringBuilder()
            sb.append("<$name>")
            list.forEach {
                sb.append(it.toString())
            }
            sb.append("</$name>")
            return sb.toString()
        }
    }
    
    
    class Html : Tag("Html")
    
    class Head : Tag("Head")
    
    class Body : Tag("Body")
    
    class Title : Tag("Title")
    
    class Div : Tag("Div")
    
    @DslMarker
    annotation class TAG
    
  1. DSLClass_构建器设计模式

    /**
     * @ 文件名:   `05.DSLClass_构建器`
     * @ 创建者:   ty
     * @ 时间:    2018/8/2 09:18
     * @ 描述:    builder.build()
     * 字段可以赋值多次  需要只能赋值一次
     * 创建Person时不能传递字段  就需要默认值null  后面不能修改了
     * 创建Person时必须要传递字段
     * Person可以等到所有的字段都有了之后再创建
     *
     * 1,创建person  address 数据类,构造参数可空类型
     * 2,创建personBuilder addressBuilder构建类,有一个build函数返回person address对象。
     * 3,创建person address 高阶函数,
     * 4,由于一个人可能有多个地址,需要用一个集合字段装起来多个地址,定义一个MyList继承ArrayList
     * 5,同时person中有一个list字段addresses
     * 6,有个addresses的高阶方法,收集所有的地址
     *
     *  完成如下效果
     *  val person = person {
     *      name = "林志颖"
     *      age = 19
     *      addresses {
     *          address {
     *              city = "深圳市"
     *              street = "新安街道"
     *              number = 122
     *          }
     *          address {
     *              city = "重庆市"
     *              street = "照母山"
     *              number = 122
     *          }
     *      }
     *  }
     *
     *  Person(name=林志颖, age=19, addresses=[Address(city=深圳市, street=新安街道, number=122), Address(city=重庆市, street=照母山, number=122)])
     *
     */
    
    
    fun main(args: Array<String>) {
    
        val person = person {
            name = "林志颖"
            age = 19
            addresses {
                address {
                    city = "深圳市"
                    street = "新安街道"
                    number = 122
                }
                address {
                    city = "重庆市"
                    street = "照母山"
                    number = 122
                }
            }
        }
    
        println(person)
    
    }
    
    
    fun MyList.address(block: AddressBuilder.() -> Unit) {
    
        val address = AddressBuilder()
        address.block()
        add(address.build())
    }
    
    fun PersonBuilder.addresses(block: MyList.() -> Unit) {
        val myList = MyList()
        myList.block()
        this.addresses = myList
    
    }
    
    class PersonBuilder {
        var name: String? = null
        var age: Int? = null
        var addresses: MyList? = null
        fun build(): Person {
            return Person(name, age, addresses)
        }
    }
    
    @MYCLASS
    class AddressBuilder {
        var city: String? = null
        var street: String? = null
        var number: Int? = null
        fun build(): Address {
            return Address(city, street, number)
        }
    }
    
    
    @MYCLASS
    fun person(block: PersonBuilder.() -> Unit): Person {
        val person = PersonBuilder()
        person.block()
        return person.build()
    }
    
    data class Address(val city: String?, val street: String?, val number: Int?)
    
    data class Person(val name: String?, val age: Int?, val addresses: MyList?)
    
    @MYCLASS
    class MyList : ArrayList<Address>()
    
    @DslMarker
    annotation class MYCLASS
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容