• Kotlin语法学习(一)


    Kotlin语法学习(一)

    变量和函数

    变量

    • 在Kotlin中定义变量的方式和java有很大的区别,在java中有很多的基本类型和一些引用类型,但是在Kotlin中定义一个变量只允许在变量前面声明两个关键字:val和var
    • val(value的简写)用来声明一个不可变的变量,这种变量在初始赋值之后再也不能重新赋值,相当于java当中的final修饰的变量
    • var(variable的简写)用来声明一个可变的变量,这种变量在初始赋值之后还是可以随意修改的

    那么我们什么时候使用val什么时候使用var呢?

    永远优先使用val来声明一个变量,而当val没有办法满足你的需求的时候再使用var,这样设计出来的程序会更加的健壮,也更加符合高质量的编程规范.

    fun main() {
        //Kotlin语法代码的结尾不需要加分号
        val a = 10
        println("a = " + a)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 在Kotlin当中拥有出色的类型推导机制,在上面的代码当中,我们将整形10赋值给变量a,这里a就会被自动推导成为整型变量,因为既然你要将整形的值赋给一个变量,那么这个变量必然是整形的才可以,然后要是将一个字符串赋值给变量,那么变量同样会被自动推导成为字符串类型.
    • 但是这种类型推导机制并不是每次都是正确的,当我们对一个变量延迟赋值的话,那么Kotlin就没有办法自动推导它的类型了,所以在Kotlin当中也给我们提供了显示声明变量类型的语法
    //显示的声明一个整形变量a的值为10
    val a: Int = 10
    
    • 1
    • 2
    • 在Kotlin当中完全抛弃了java当中的基本类型,全部使用了对象数据类型.

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apWSBh1V-1667836497984)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221107000827484.png)].

    函数

    • 在Kotlin中自定义函数的语法
    fun methodName(param1: Int, param2: Int): Int {
        return 0
    }
    
    • 1
    • 2
    • 3
    • fun(function的简写)是定义函数的关键字,无论定义什么函数都要使用fun关键字来进行声明
    • 紧跟在fun后面的是函数的名字,这个没什么要求,但是要见名知意
    • 函数名后面紧跟一对括号,里面声明函数在调用的时候要接收的参数,参数的数量可以是任意多个,例如在上面的示例中函数需要接收两个整形的参数,参数定义的格式为参数名: 参数类型
    • 参数括号后面的部分是可选的,用于声明该函数会返回什么类型的数据,上述示例就表明该函数会返回类型为Int的返回值,如果你的函数不需要返回任何数据,那么这部分可以省略
    • 最后在一对大括号中的内容就是函数体了,在函数体中编写函数的具体逻辑

    按照上述逻辑定义一个返回两数中较大数的函数

    fun largeNumber(param1: Int, param2: Int): Int {
        return max(param1, param2)
    }
    
    • 1
    • 2
    • 3
    • 在Kotlin中当一个函数只有一行代码的时候,Kotlin允许我们不必编写函数体,可以直接将唯一一行代码写在函数定义的尾部,中间用等号连接即可,这个机制叫做语法糖

    • 所以上面这个返回大数的函数可以简写为

    fun largeNumber(param1: Int, param2: Int): Int = max(param1, param2)
    
    • 1

    合理使用Kotlin函数的语法糖可以简化我们的开发

    程序的逻辑控制

    if条件语句

    • 在Kotlin当中的if语句和java当中的if语句几乎没有什么区别.

    • 只不过在Kotlin当中的if语句有一个额外的功能,它可以有返回值,返回值就是在每一个条件中的最后一行代码的返回值

    • 将返回大数的函数逻辑重写

    fun largeNumber(param1: Int, param2: Int): Int {
        var value = if (param1 > param2) {
            param1
        } else {
            param2
        }
        return value
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • if语句使用每个条件的最后一行代码作为返回值,并将返回值赋给了value变量
    • 将上述代码使用语法糖再进行精简一下
    fun largeNumber(param1: Int, param2: Int): Int = if (param1 > param2) {
        param1
    } else {
        param2
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    when条件语句

    • Kotlin中的when语句有点类似于java中的switch语句,但是他远比switch语句强大的多.
    • 在java当中的switch语句实际上并不好用,因为只能传入整形或者短于整形的变量作为条件,JDK1.7之后增加了对字符串变量的支持,但是如果判断条件不是上述几种类型那么switch将不合适,其次就是switch语句在每个case后面都要加上break语句,否者就会依次进行执行,如果发生了疏忽就会造成一些奇怪的bug
    • 在Kotlin当中when语句解决了以上的痛点,还增加了许多更为强大的特性

    编写一个根据姓名返回考试成绩的函数

    • if版本
    /**
     * 根据姓名返回对应的分数
     */
    fun getScore(name: String) = if (name == "Tom") {
        86
    } else if (name == "Jim") {
        77
    } else if (name == "Jack") {
        99
    } else {
        0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    能够实现,但是if-else导致代码比较冗余,在Kotlin当中当判断条件比较多的时候,就是应该考虑when语句的时候

    • when版本
    fun getScore(name: String) = when (name) {
        "Tom" -> 86
        "Jim" -> 77
        "Jack" -> 99
        else -> 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    when版本的代码就变得干净清爽了许多,另外when和if语句一样也是可以有返回值的,因此上述代码也可以采用语法糖进行编写

    • when语句允许传入任意类型的参数,然后再when的结构体中定义一系列的条件,
    • 格式是: 匹配值 -> {执行逻辑}
    • 当执行逻辑只有一行代码的时候,{}可以进行省略

    when语句除了支持精确匹配之外,还支持类型匹配,例如下面这个代码

    /**
     * when语句匹配类型
     */
    fun checkNumber(num: Number) {
        when(num) {
            is Int -> println("Number is Int")
            is Double -> println("Number id Double")
            else -> println("Number not support")
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 在上述的代码当中,is是类型匹配的核心,它相当于java当中的instanceof关键字.
    • Number是Kotlin内置的一个抽象类,像Int,Long,Float,Double等与数字相关的类都是它的子类.

    when语句还有一种不带参数的写法,具备了比较强的扩展性,以上面的getScore函数为例子

    fun getScore(name: String) = when {
        name == "Tom" -> 86
        name == "Jim" -> 77
        name == "Jack" -> 99
        else -> 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 这种写法是将判断的表达式完全的写在when的结构体当中,在Kotlin当中判断字符串是否相等可以直接使用 == 关键字,这种when不带参数的写法看起来比较冗余,但是有些场景必须使用这中写法才能实现
    • 假如有一个场景是以Tom为开头的人的分数都是86,那么如果拿带参数的when就会很麻烦,需要将所有的情况都列举出来,但是这个时候使用不带参数的when就比较方便了
    fun getScore(name: String) = when {
        name.startWith("Tom") -> 86
        name == "Jim" -> 77
        name == "Jack" -> 99
        else -> 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 现在这样不管是传入Tom还是传入Tommy得到的结果都是86.

    循环语句

    • 在Kotlin当中的循环语句和java当中一样也是while循环和for循环,其中while循环不管是在语法还是使用技巧上面和java中的while循环没有什么任何区别
    • 但是Kotlin在for循环方面做了很大的修改,java中最常用for-i循环在Kotlin中直接被舍弃,但是Kotlin中将java当中for-each循环进行了大幅度的加强,变成了for-in循环
    • 首先要了解一个区间的概念,在Kotlin当中,可以用下面这种方式来表示一个区间
    val range = 0..10
    
    • 1
    • 上面这行代码表示创建了一个0到10的闭区间,包含两个端点也就是[0,10]
    • 其中 … 是创建两端闭区间的关键字,在 … 的两边指定区间的左右端点就可以创建一个区间
    • 有了区间之后,我们就可以通过for-in循环来遍历这个区间,比如在main函数当中编写先下面这个代码
    fun main() {
        for(i in 0..10) {
            println(i)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 但是我们知道数组的下标一般都是从0开始的,一个长度为10的数组,它的范围是0到9,所以在程序设计当中,左闭右开的区间会更加常用一些
    • 在Kotlin当中可以使用until关键字来创建一个左闭右开的区间
    val range = 0 until 10
    
    • 1
    • 在上述的代码中创建了一个左闭右开的区间,[0, 10)
    • 默认情况下for-in循环每次执行循环的hi后会在区间范围递增1,相当于java中for-i循环中的i++,而你如果想要跳过其中一些元素的时候,可以使用step关键字
    fun main() {
        for (i in 0 until 10 step 2) {
            println(i)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 上述代码表示在遍历0 ~ 9的过程当中,每次执行循环都会在范围内递增2,相当于java中for-in循环的i = i + 2
    • 上述两种关键字 … 和 until都要求区间的左端必须要小于区间的右端,也就是说这两种关键字创建出来的范围都是升序的范围
    • 如果想要创建一个降序的范围可以使用downTo关键字,用法如下
    fun main() {
        for(i in 10 downTo 1) {
            println(i)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 在上述的代码当中创建了一个[10,1]的降序闭区间
  • 相关阅读:
    王道机试C++第 4 章 字符串:字符串内容详解及三个小程序 Day29
    通俗解释魔法命令
    uniapp 全部权限
    taro小程序开发、h5前端开发有什么不一样呢?
    Python 实现Excel自动化办公(中)
    多线程编程模式-Producer-consumer
    OpenCV项目开发实战--实现对象检测的选择性搜索 (C++ / Python)代码
    信息论自总结笔记(仍然在更新)
    Typescript的高级tricks(in,keyof,Partial,Pick,Exclude等)
    几乎所有的互联网公司都在进行一场脱虚向实的全新嬗变
  • 原文地址:https://blog.csdn.net/weixin_45809829/article/details/127742186