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

2020-01-17  本文已影响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()
    }
}

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

上一篇下一篇

猜你喜欢

热点阅读