美文网首页
Kotlin学习笔记(未完待续...)

Kotlin学习笔记(未完待续...)

作者: 生活简单些 | 来源:发表于2020-01-17 14:20 被阅读0次

    学习新语言的最好办法是寻找差异,并记录,最后只要不断巩固差异!

    1. 每个数字类型支持如下的转换:

    toByte(): Byte
    toShort(): Short
    toInt(): Int
    toLong(): Long
    toFloat(): Float
    toDouble(): Double
    toChar(): Char
    

    2. 位运算

    shl(bits) – 有符号左移
    shr(bits) – 有符号右移
    ushr(bits) – 无符号右移
    and(bits) – 位与
    or(bits) – 位或
    xor(bits) – 位异或
    inv() – 位非
    
    // example
    val x = (1 shl 2) and 0x000FF000
    

    3. row string

    val text = """
        for (c in "foo")
            print(c)
    """
    

    你可以通过 trimMargin() 函数去除前导空格:

    val text = """
        |Tell me and I forget.
        |Teach me and I remember.
        |Involve me and I learn.
        |(Benjamin Franklin)
        """.trimMargin()
    val text = """
        |Tell me and I forget.
        |Teach me and I remember.
        |Involve me and I learn.
        |(Benjamin Franklin)
        """.trimMargin()
    

    默认 | 用作边界前缀,但你可以选择其他字符并作为参数传入,比如 trimMargin(">")。

    4. When 表达式

    
    // 最简单的写法
    when (x) {
        1 -> print("x == 1")
        2 -> print("x == 2")
        else -> { // 注意这个块
            print("x is neither 1 nor 2")
        }
    }
    
    // 多种case可以合并
    when (x) {
        0, 1 -> print("x == 0 or x == 1")
        else -> print("otherwise")
    }
    
    // case不一定非要固定的value,也可以是表达式
    when (x) {
        parseInt(s) -> print("s encodes x")
        else -> print("s does not encode x")
    }
    
    // case是在某个范围内
    when (x) {
        in 1..10 -> print("x is in the range")
        in validNumbers -> print("x is valid")
        !in 10..20 -> print("x is outside the range")
        else -> print("none of the above")
    }
    
    // 甚至是各种判断
    fun hasPrefix(x: Any) = when(x) {
        is String -> x.startsWith("prefix")
        else -> false
    }
    

    5. for循环

    // in 后可以是一个数组变量,也可以是临时的数组,如:`for(item: Int in 1..3)`
    for (item: Int in ints) {
        // ……
    }
    
    // 同时获得index和value
    for ((index, value) in array.withIndex()) {
        println("the element at $index is $value")
    }
    

    6. 退出多层循环

    loop@ for (i in 1..100) {
        for (j in 1..100) {
            if (……) break@loop
        }
    }
    
    fun foo() {
        listOf(1, 2, 3, 4, 5).forEach lit@{
            if (it == 3) return@lit // 局部返回到该 lambda 表达式的调用者,即 forEach 循环
            print(it)
        }
        print(" done with explicit label")
    }
    

    7. 内部类访问父级指定的类

    // 访问指定父类的实现
    class FilledRectangle: Rectangle() {
        fun draw() { /* …… */ }
        val borderColor: String get() = "black"
        
        inner class Filler {
            fun fill() { /* …… */ }
            fun drawAndFill() {
                super@FilledRectangle.draw() // 调用 Rectangle 的 draw() 实现
                fill()
                println("Drawn a filled rectangle with color ${super@FilledRectangle.borderColor}") // 使用 Rectangle 所实现的 borderColor 的 get()
            }
        }
    }
    
    // 集成了多个类并访问父级实现
    open class Rectangle {
        open fun draw() { /* …… */ }
    }
    
    interface Polygon {
        fun draw() { /* …… */ } // 接口成员默认就是“open”的
    }
    
    class Square() : Rectangle(), Polygon {
        // 编译器要求覆盖 draw():
        override fun draw() {
            super<Rectangle>.draw() // 调用 Rectangle.draw()
            super<Polygon>.draw() // 调用 Polygon.draw()
        }
    }
    

    最近工作内容有点分散,下次回来再继续。。。

    相关文章

      网友评论

          本文标题:Kotlin学习笔记(未完待续...)

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