美文网首页kotlin入门学习笔记
《极客时间---快速上手Kotlin开发》学习笔记(二)

《极客时间---快速上手Kotlin开发》学习笔记(二)

作者: 青_雉 | 来源:发表于2019-11-24 15:32 被阅读0次

    极客时间kotlin课程第11 ~ 15讲。

    动态代理

    对象代理
    interface Animal {
     fun bark()
    }
    
    class Dog : Animal {
        override fun bark(){
            println("wang")
        }
    }
    
    class Zoo(animal: Animal): Animal by animal {
            override fun bark(){
            println("before")
    //        animal.bark()  编译错误
            println("after")
        }
    }
    
    fun main(args: Array<String>) {
        Dog().bark()
        Zoo(Dog()).bark()
    }
    

    课程中以上面的代码为例子,讲这个叫动态代理

    而且在Zoo类中自定义实现的bark方法中,并没有办法在被代理的方法前后做一些事情。(会有编译错误)

    这个工具能想到的使用场景,额,适配器,也许吧,感觉作用不大。

    这里是官网关于kotlin代理的文档。

    属性代理

    官网文档相关的属性代理的文档,可以实现如下场景:

    • lazy properties: the value gets computed only upon first access;
    • observable properties: listeners get notified about changes to this property;
    • storing properties in a map, instead of a separate field for each property.

    本地属性延迟加载的例子:

    class Foo {
        init {
            println("foo init")
        }
        fun isValid():Boolean = false
        fun doSomething(){
            println("do sth")
        }
    }
    
    fun example(computeFoo: () -> Foo) {
        val memoizedFoo by lazy(computeFoo)
        if (1 == 2) {
            memoizedFoo.doSomething()
        }
    }
    
    fun main(args: Array<String>) {
        example { Foo() }
    }
    

    上面这个方法不会输出foo init

    其他两个场景,可以到官网看下例子。

    数据类

    通过data关键字描述类,自动实现get set toString方法,像下面这个Student类。

    所以这个是不是可以立刻在自己的项目里开始使用,节省一些代码了。

    data class Student(var age: Int, var name: String)
    
    fun main(args: Array<String>) {
        var s = Student(12, "zhangsan")
        println(s.toString())
        println(s.age)
        println(s.name)
        s.age = 14
        s.name = "lisi"
        println(s.age)
        println(s.name)
    }
    

    超级枚举

    没看到有多超级吧,挺好玩确实

    sealed class Action{
        object UP: Action()
        object DOWN: Action()
    }
    
    fun exec(action: Action) = when(action){
        Action.UP -> {
            println("up")
        }
        Action.DOWN -> {
            println("down")
        }
    }
    fun main(args: Array<String>) {
        exec(Action.UP)
    }
    

    解构

    class Student(var name: String, var age: Int) {
        operator fun component1() = name
        operator fun component2() = age
    
    }
    
    fun main(args: Array<String>) {
        var s = Student("zhangsan", 12)
        var (name, age) = s
        println("$name $age")
    
        var mapVal = mapOf<String, String>("name" to "zhangsan", "age" to "12")
        for ((k, v) in mapVal) {
            println("$k $v")
        }
    }
    

    循环

    下面的代码编译错误

    var i = 0
    for (i = 0; i<10; i++){
      println(i)
    }
    

    循环的几种方法

    fun main(args: Array<String>) {
        for (i in 1..10) {
            println(i)
        }
    
        for (i in 1..10 step 2) {
            println(i)
        }
    
        for (i in 1 until 10) {
            println(i)
        }
    
        for(i in 10 downTo 0){
            println(i)
        }
    
        repeat(10){
            println(it)
        }
    }
    

    list遍历

     var names = arrayListOf<String>("zhangsan", "lisi")
    
    for (name in names) {
      println(name)
    }
    //index 和 str2 这两个变量名是无所谓的
    for ((index, str2) in names.withIndex()) {
      println("$index    $str2")
    }
    

    集合操作符

    这一块是第15讲的内容,知识点主要如下代码里的两项。

    视频中讲师为了体现kotlin的有点,特意对比的写了一套基于rxjava的写法,一手的内部类做的,java原生也支持lambda的啊,没必要这样。(当然kotlin的lambda肯定是更精简的)

    fun main(args: Array<String>) {
        var ages = arrayListOf(1, 2, 3, 4, 5, 6)
        //原生支持各种链式集合操作符号
        ages.map { it - 1 }
                .filter { it > 0 }
                .reduce{i1, i2 -> i1 + i2}
                .also { println(it) }
        ages.convert { it + 1 }.forEach{println(it)}
    
    }
    
    //自定义集合操作符(扩展函数)
    inline fun <T, E> Iterable<T>.convert(action: (T) -> E): MutableList<E> {
        val result = mutableListOf<E>()
        for(i in this){
            result.add(action(i))
        }
        return result
    }
    

    相关文章

      网友评论

        本文标题:《极客时间---快速上手Kotlin开发》学习笔记(二)

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