Kotlin语法学习

Posted z啵唧啵唧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

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

函数

  • 在Kotlin中自定义函数的语法
fun methodName(param1: Int, param2: Int): Int 
    return 0

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

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

fun largeNumber(param1: Int, param2: Int): Int 
    return max(param1, param2)

  • 在Kotlin中当一个函数只有一行代码的时候,Kotlin允许我们不必编写函数体,可以直接将唯一一行代码写在函数定义的尾部,中间用等号连接即可,这个机制叫做语法糖

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

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

合理使用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

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

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

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

  • when版本
fun getScore(name: String) = when (name) 
    "Tom" -> 86
    "Jim" -> 77
    "Jack" -> 99
    else -> 0

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")
    

  • 在上述的代码当中,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

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

  • 现在这样不管是传入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
  • 上面这行代码表示创建了一个0到10的闭区间,包含两个端点也就是[0,10]
  • 其中 … 是创建两端闭区间的关键字,在 … 的两边指定区间的左右端点就可以创建一个区间
  • 有了区间之后,我们就可以通过for-in循环来遍历这个区间,比如在main函数当中编写先下面这个代码
fun main() 
    for(i in 0..10) 
        println(i)
    

  • 但是我们知道数组的下标一般都是从0开始的,一个长度为10的数组,它的范围是0到9,所以在程序设计当中,左闭右开的区间会更加常用一些
  • 在Kotlin当中可以使用until关键字来创建一个左闭右开的区间
val range = 0 until 10
  • 在上述的代码中创建了一个左闭右开的区间,[0, 10)
  • 默认情况下for-in循环每次执行循环的hi后会在区间范围递增1,相当于java中for-i循环中的i++,而你如果想要跳过其中一些元素的时候,可以使用step关键字
fun main() 
    for (i in 0 until 10 step 2) 
        println(i)
    

  • 上述代码表示在遍历0 ~ 9的过程当中,每次执行循环都会在范围内递增2,相当于java中for-in循环的i = i + 2
  • 上述两种关键字 … 和 until都要求区间的左端必须要小于区间的右端,也就是说这两种关键字创建出来的范围都是升序的范围
  • 如果想要创建一个降序的范围可以使用downTo关键字,用法如下
fun main() 
    for(i in 10 downTo 1) 
        println(i)
    

  • 在上述的代码当中创建了一个[10,1]的降序闭区间

以上是关于Kotlin语法学习的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin基本的语法学习

Kotlin语法学习

Android:Kotlin详细入门学习指南-函数-基础语法

Android:Kotlin详细入门学习指南-基础语法

Android:Kotlin详细入门学习指南-高阶函数-基础语法

Android:Kotlin详细入门学习指南-高阶函数-基础语法