美文网首页
Kotlin基础

Kotlin基础

作者: agile4j | 来源:发表于2019-04-09 08:39 被阅读0次
    • 目录与的结构无需匹配:源代码可以在文件系统的任意位置
    • 一切都是对象(即,任何变量都是根据引用类型来使用的)
    • 变量分为var(可变的)和val(不可变的)。首选使用val不变值的好处:可预测的行为和线程安全
    • 具有变量类型推断功能,例如可以这么写:
    var x = 5 //自动推断出‘Int’类型
    var y: Int = 1 //显式指定‘Int’类型
    
    • is运算符检测一个表达式是否为某类型的一个实例
    • 原始字符串三重引号分隔。原始字符串可包括换行符和任何其他字符
    • 字符串可以包含模板表达式,模板表达式由$符号开始
    • if语句是一个表达式,即它会返回一个值,例如:
    val max = if (a > b) a else b
    
    • if的分支也可以是代码块,最后的表达式作为该快的值,例如:
    val max = if (a > b) {
        print("max is a")
        a
    } else {
        print("max is b")
        b
    }
    
    • kotlin没有三元表达式,别if else替代了。例如:
    if(true) 1 else 0
    
    • 如果表达式只有一个分支,或分支的结果是Unit,它的值就是Unit
    • when表达式替代了switch case表达式,且更灵活强大。例如:
    fun cases(obj:Any){
        when(obj){
            1,"one" -> print("第一项")
            in 2..10 -> println("在区间[2,10]中")
            !in validNumbers -> println("不在集合validNumbers中")
            "hello" -> print("这个字符串是hello")
            is Long -> print("这是一个Long类型的数据")
            !is String -> print("这不是一个String类型的数据")
            else -> print("else类似于Java中的default")
        }
    }
    
    • 与if一样,when的每一个分支也可以是一个代码块,它的值是块中最后的表达式的值
    • 使用for循环遍历数组或list的三种方式:
    for(arg in args){
        println(arg)
    }
    
    for(i in array.indices){
        println(args[i])
    }
    
    for((index, value) in array.withIndex()){
        println(the element at $index is $value)
    }
    
    • 函数的返回值可以不需要显示地用return来指定,但用return的编码风格更易于阅读
    • kotlin中可以直接使用=符号来直接返回一个函数的值:
    fun sum(a: Int, b: Int) = a + b
    fun max(a: Int, b: Int) = if (a > b) a else b
    val sum = fun (a: Int, b: Int) = a + b
    sum(1,1) // 2
    val sumf = fun (a: Int, b: Int) = {a + b} 
    sumf(1,1).invoke() // 2
    
    • return语句会从最近的函数或匿名函数中返回,但是在lambda表达式中遇到return,则直接返回最近的外层函数
    fun returnDemo_1(){
        println("START " + ::returnDemo_1.name)
        val intArray = intArrayOf(1,2,3,4,5)
        intArray.forEach{
            if(it == 3) return
            println(it)
        }
    }
    //1
    //2
    fun returnDemo_2(){
        println("START " + ::returnDemo_2.name)
        val intArray = intArrayOf(1,2,3,4,5)
        intArray.forEach{
            fun (a: Int){
                if(a == 3) return
                println(a)
            }
        }
    }
    //1
    //2
    //4
    //5
    
    • 在kotlin中任何表达式都可以用标签来标记。标签的格式为标识符后跟@符号,例如abc@、jarOfLove@都是有效的标签。可以用标签来控制return、break或continue的跳转行为。Kotlin的函数是可以被嵌套的。它有函数字面量局部函数等。有了标签限制的return,就可以从外层函数返回了。例如从lambda表达式中返回,returnDemo_3()我们可以显示制定lambda表达式的return地址是其入口处:
    fun returnDemo_3() {
        val intArray = intArrayOf(1,2,3,4,5)
        intArray.forEach here@ {
            if( it == 3 ) return@here //指令跳转到lambda表达式标签here@处,继续下一个it=4的遍历循环
            println(it)
        }
    }
    //1
    //2
    //4
    //5
    
    • 上面的demo在lambda表达式开头处添加了标签here@,可以这么理解:该标签相当于是记录了lambda表达式的指令执行入口地址,然后在表达式内部就可以使用return@here来跳转至lambda表达式该地址处
    • 另外,也可以使用更加方便的隐式标签,该标签与接收该lambda的函数同名,例如:
    fun returnDemo_4() {
        val intArray = intArrayOf(1,2,3,4,5)
        intArray.forEach {
            if (it == 3) return@forEach 
            println(it)
        }
    }
    
    • 当在多层嵌套循环体中使用break时,会跳出最近外层的循环(也可用标签来显式地指出循环体的跳转地址来提高代码可读性:inner@、break@inner)。当想让break直接跳转到外层for循环,就可以使用标签了。例如:
    fun breakDemo_2() {
        outer@ for (outer in 1..5) {
            for (inner in 1..10) {
                println("inner=" + inner)
                println("outer=" + outer)
                if (inner % 2 == 0){
                    break@outer
                }
            }
        }
    }
    //inner=1
    //outer=1
    //inner=2
    //outer=1
    
    • kotlin中throw是表达式,它的类型是特殊类型Nothing。该类型没有值,跟C、Java中的void意思一样。在代码中用Nothing来标记无返回的函数:
    fun fail(msg:String):Nothing { throw IllegalArgumentException(msg) }
    
    // 如果把一个throw表达式的值赋值给一个变量,需要显式声明类型为Nothing
    // 另外,因为ex变量是Nothing类型,没有任何值,所以无法当做参数传给函数
    val ex:Nothing = throw Exception("YYY")
    
    • kotlin的块注释可嵌套

    END

    参考资料:《Kotlin极简教程》

    相关文章

      网友评论

          本文标题:Kotlin基础

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