美文网首页
Kotlin 变量、函数、程序的逻辑控制以及循环

Kotlin 变量、函数、程序的逻辑控制以及循环

作者: code希必地 | 来源:发表于2020-09-17 17:56 被阅读0次

    1、Kotlin的原理

    编程语言大致可以分为二类:

    • 1、编译型语言
      编译型语言的特点是:编译器将我们编写的代码一次性编译成计算机可识别的二进制文件,然后计算机直接执行,像C和C++都属于编译型语言。
    • 2、解释型语言
      解释型语言的特点是:在程序运行时,解释器一行行读取我们编写的源代码,然后将其转换成计算机可识别的二进制数据后再执行,因此效率较低,如Python、JavaScript、Java等都属于解释型语言。
      Java编译之后生成的class文件,并不是计算机识别的二进制文件,所以这就需要Java虚拟机充当解释器的作用,将class文件转成二进制文件。
      如果有一种新的语言也能编译生成和Java相同规格的class文件,那么这个新语言是不是也能开发Android程序,答案是肯定的,这也就是Kotlin的工作原理。

    2、Kotlin的优点

    • 1、Kotlin比较简洁,开发相同的功能,相比于Java能减少50%的代码量,甚至更多。
    • 2、Kotlin更加高级,Kotlin增加了现代高级语言的语法特性,提高了开发的效率。
    • 3、Kotlin在安全性上做了很多的努力,几乎杜绝了空指针异常。
    • 4、和Java是100%兼容。

    3、变量

    Kotlin中定义变量,只允许在变量前声明两种关键字:

    • 1、val:用来声明一个不可变的变量,这种变量在初始赋值之后就不能再重新赋值,对应java中的final变量。
    • 2、var:用来声明一个可变的变量,这种变量在赋值之后仍然可以重新赋值,对应java中的非final变量。
      举个例子
    fun main(){
      val a=10
    }
    

    看到这里很多人肯定会有疑问:变量的类型该怎么定义呢?

    3.1、Kotlin类型推导机制

    对于Kotlin来说,它是不需要显式的定义变量的类型,因为Kotlin拥有出色的类型推导机制,比如上面的例子中val a=10那么a的类型就是整型变量,如果把一个字符串赋值给a那么a就是字符串变量
    如果开发者不想相信类型推导机制,也可以显式的定义变量的类型:

    val a:Int=10
    

    在上面,我们显式的指定整型变量为Int,这和java还是有区别的,在java中我们会使用关键字int,它们还是有区别的。在Kotlin中Int不再是关键字而是一个类,它拥有自己的方法和继承结构。

    3.2、Java和Kotlin数据类型对照表

    Java基本数据类型 Kotlin对象数据类型 数据类型说明
    int Int 整型
    long Long 长整型
    short Short 短整型
    float Float 单精度浮点型
    double Double 双精度浮点型
    boolean Boolean 布尔型
    char Char 字符型
    byte Byte 字节型

    4、函数

    先看下Kotlin中函数的标准定义规则:

    fun function_name( param1 : Int , param2 : Int ) : Int {}
    
    • 1、fun是定义函数的关键字,无论定义什么函数,都必须使用fun来声明函数。
    • 2、紧跟着fun后面的就是方法名(可随意编写)
    • 3、括号里面的是参数,param1表示参数名,后面跟 参数的类型,参数个数不限。
    • 4、括号后的: Int表示返回值类型,如果无返回值可不写
    • 5、大括号里的内容是方法体。
      举例如下:
    fun main(){
       val a=10
        val b=100
        val result=getLargeNumber(a,b)
        println("输出的结果是:result="+result)
    }
    
    fun getLargeNumber(num1:Int,num2:Int) : Int{
        return max(num1,num2)
    }
    

    如果方法体中只有一行代码的话:简化方法getLargeNumber

    fun getLargeNumber(num1:Int,num2:Int) : Int=max(num1,num2)
    

    由于其出色的类型推导机制,函数max的返回值为整型,继续简化如下:

    fun getLargeNumber(num1:Int,num2:Int) =max(num1,num2)
    

    5、程序的逻辑控制

    程序的执行语句主要分为3种:

    • 1、顺序语句
    • 2、条件语句
    • 3、循环语句
      顺序语句没什么好说的,就是一行一行的执行。

    5.1、条件语句

    Kotlin中实现条件语句的方法有两种:if和when

    5.1.1 使用if实现条件语句

    Kotlin中的if的用法和Java中几乎没有什么区别。

    fun getLargeNumber(num1:Int,num2:Int) : Int {
        var result:Int
        if(num1>=num2){
            result=num1
        }else{
            result=num2
        }
        return result
    }
    

    Kotlin中的if相比于Java有一个额外的功能:它是可以有返回值的。返回值就是if条件语句每一个条件中最后一行代码的返回值。
    上面例子可简化为

    fun getLargeNumber(num1: Int, num2: Int): Int {
        return if (num1 >= num2) {
            num1
        } else {
            num2
        }
    }
    

    上面说过,方法体中只有一行代码的简化,可继续简化为一行代码

    fun getLargeNumber(num1: Int, num2: Int) = if (num1 >= num2) num1 else num2
    

    5.1.2、when条件语句

    Kotlin中的when类似于Java中的switch,但是比switch强大了很多,在java中switch只能传入整形、字符串、枚举或短于整形的变量作为条件,相比来说when就比较强大了,可以传入任意类型的值。
    先看一个用if实现的简单例子

    fun getScore(name: String) = if (name == "Tom") {
            88
        } else if (name == "LiLi") {
            90
        } else {
            100
        }
    

    1、精确匹配
    再看下用when如何实现相同的功能

    fun getScoreByWhen(name: String) =
                when (name) {
                    "Tom" -> {
                        Log.e("TAG","when的每一个条件的最后一句的返回值,也可以作为返回值和if一样")
                        88
                    }
                    "LiLi" -> 90
                    else -> 100
                }
    

    可以看到when也是有返回值的,每一个条件的最后一句来作为返回值,和if的使用是一样的。
    when允许传入一个任意类型的参数,when中结构体的标准格式是

    匹配值 -> {执行逻辑}
    

    2、类型匹配
    when除了上面的精确匹配外还有类型匹配看个例子

    fun checkNum(number: Number) {
            when (number) {
                is Float -> Log.e("TAG", "传入的是Float类型")
                is Double -> Log.e("TAG", "传入的是Double类型")
                is Int -> Log.e("TAG", "传入的是Int类型")
            }
        }
    

    其中is关键字是类型匹配的核心,和Java中的instanceof的作用一样,在KotlinInt、Float、Double等数字相关的类都是其子类。
    3、不带参数匹配
    when除了上面的用法外,还有一种不带参数的匹配方式

    fun noParamWhen(name: String) = when {
            name == "Tom" -> 88
            name == "LiLi" -> 90
            else -> 100
        }
    

    这种写法看着有点麻烦,其实它还是有存在的意义的,下面举例说明

    fun noParamWhen(name: String) = when {
            name.startsWith("Tom") -> 88
            name == "LiLi" -> 90
            else -> 100
        }
    

    想实现上面这种功能的话就不能使用带参数的方式来实现。

    6、循环语句

    Java中主要有2中循环:while循环和for循环,在Kotlin中也提供了while循环和for循环,其中Kotlin中的while循环和Java中没什么区别,所以这里只需要学习下for循环的使用。
    Kotlin中摒弃了Java的for-i循环,并将Java中的for-each循环修改成了for-in循环,先看下for-in循环的使用。

    fun forCircle() {
            for(i in 0 .. 10){
                Log.e("TAG", "for-in循环::"+i)
            }
        }
    

    ..是定义区间的关键字,0 .. 10就表示区间为[0,10],可以看到这个区间是左闭右闭的,如何表示左闭右开呢?这就用到了until关键字

    fun forCircle2(){
            for(i in 0 until 10){
                Log.e("TAG", "for-in循环,区间是左闭右开:"+i)
            }
        }
    

    上面两个例子循环的步长都是1,那么如何修改步长呢?这就需要使用关键字step

    fun forCircle3(){
            for(i in 0 .. 10 step 5){
                Log.e("TAG", "for-in循环,步长为5:"+i)
            }
        }
    

    上面的例子都是升序的,如何实现降序呢?使用关键字downTo即可实现

    fun forCircle4(){
            for(i in 10 downTo 0 ){
                Log.e("TAG", "for-in循环,降序:"+i)
            }
        }
    

    相关文章

      网友评论

          本文标题:Kotlin 变量、函数、程序的逻辑控制以及循环

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