Kotlin安卓开发学习(1)

Kotlin变量与函数

变量:

Kotlin中的变量定义和Java中差别很大,与Java中需要给变量明确定义变量类型不同,Kotlin只允许变量前声明两种关键字:valvar

  1. val: (value)用来声明一个不可变的变量,这种变量在初始赋值之后就再也不能重新赋值,对应Java中的final变量。
  2. var:(variable的简写)用来声明一个可变的变量,这种变量在初始赋值之后仍然可以再被重新赋值,对应Java中的非final变量。

Kotlin有着优秀的类型推导机制,可以完成类型的自动推导,所以只需要这两种关键字便可。

如:

fun main() {
  val a = 10
  println("a = " + a)
}

注意的是,与Java不同Kotlin每一行结尾不用加分号。

当然,除了让程序自动推导变量类型,我们也可以自己显式地设定变量类型,使用如:

val a: Int = 10

将a变量声明为了Int类型

函数:

Kotlin允许我们自己定义函数,基本语法规则如下:

fun methodName(param1: Int, param2: Int): Int {
   return 0
}

首先,函数的语法需要使用 fun{}来包裹,紧跟着的就是函数名

之后括号内表示声明该函数接受什么参数,采用 “参数名: 参数类型” 方式来定义。

括号之后使用 “: 数据类型” 表示该函数返回的类型,如果没有则表示不返回数据。

需要注意的是这里有一个语法糖:

当一个函数中只有一行代码时,Kotlin允许我们不必编写函数体,可以直接将唯一的一行代码写在函数定义的尾部,中间用等号连接即可。如:

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

使用这种语法,return关键字也可以省略了,等号足以表达返回值的意思。且由于Kotlin的推导机制,这里可以简化掉返回Int类型的声明:

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

if条件语句

Kotlin中的if使用方法与Java中几乎相同,但在一些地方进行了优化:

Kotlin中的if语句相比于Java有一个额外的功能,它是可以有返回值的,返回值就是if语句每一个条件中最后一行代码的返回值。如:

fun largerNumber(num1: Int, num2: Int): Int {
  val value = if (num1 > num2) {
    num1
  } else {
    num2
  }
  return value
}

这里我们将变量之间等于if语句,而结果为对应if的最后一行代码。

这样的用法不仅可以用在赋值,也可以直接使用在函数返回上:

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

甚至直接用在函数单行语句语法糖上:

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

当然这里的{}也是可以去掉形成单行语句的,同其他语言方法。

when条件语句

Kotlin中的when条件语句类似于Java中的switch,但又比switch功能强大。

首先,switch只能传入整型或短于整型的变量作为条件,JDK 1.7之后增加了对字符串变量的支持,但如果你的判断逻辑使用的并非是上述几种类型的变量,那么不好意思,switch并不适合你。其次,switch中的每个case条件都要在最后主动加上一个break,否则执行完当前case之后会依次执行下面的case,这一特性曾经导致过无数奇怪的bug,就是因为有人忘记添加break。

when条件语句的基本语法:

fun getScore(name: String) = when (name) {
     "Tom" -> 86
     "Jim" -> 77
     "Jack" -> 95
     "Lily" -> 100
     else -> 0
}

这里在when后面括号内定义要条件源,使用 “匹配值 -> { 执行逻辑 }” 的语句来完成

使用else -> 表示默认值

对比if:

fun getScore(name: String) = if (name == "Tom") {   86
} else if (name == "Jim") {
   77
} else if (name == "Jack") {
   95
} else if (name == "Lily") {
   100
} else {
   0
}

when语句允许传入一个任意类型的参数,然后可以在when的结构体中定义一系列的条件。

除了精确匹配之外,when语句还允许进行类型匹配。什么是类型匹配呢?这里我再举个例子。定义一个checkNumber()函数,如下所示:

fun checkNumber(num: Number) {
     when (num) {
        is Int -> println("number is Int")
        is Double -> println("number is Double")
        else -> println("number not support")
     }
}

is关键字就是类型匹配的核心,它相当于Java中的instanceof关键字。

由于checkNumber()函数接收一个Number类型的参数,这是Kotlin内置的一个抽象类,像Int、Long、Float、Double等与数字相关的类都是它的子类,所以这里就可以使用类型匹配来判断传入的参数到底属于什么类型。

循环语句

与Java相同,Kotlin也提供了while和for两种循环方法,while与Java没有任何区别,但Kotlin在for循环上做了很大程度的修改。Java中最常用的for-i循环在Kotlin中直接被舍弃了,而Java中另一种for-each循环则被Kotlin进行了大幅度的加强,变成了for-in循环。

首先我们需要普及一个区间的概念:

val range = 0..10

上述代码表示创建了一个0到10的区间,并且两端都是闭区间,这意味着0到10这两个端点都是包含在区间中的,用数学的方式表达出来就是[0, 10]。

其中,..是创建两端闭区间的关键字,在..的两边指定区间的左右端点就可以创建一个区间了。

之后可以使用区间来完成for-in循环:

fun main() {
    for (i in 0..10) {
      println(i)
    }
}

但是在很多情况下,双端闭区间却不如单端闭区间好用。为什么这么说呢?相信你一定知道数组的下标都是从0开始的,一个长度为10的数组,它的下标区间范围是0到9,因此左闭右开的区间在程序设计当中更加常用。Kotlin中可以使用until关键字来创建一个左闭右开的区间,如下所示:

val range = 0 until 10

上述代码表示创建了一个0到10的左闭右开区间,它的数学表达方式是[0, 10)。修改main()函数中的代码,使用until替代..关键字,你就会发现最后一行10不会再打印出来了。

默认情况下,for-in循环每次执行循环时会在区间范围内递增1,相当于Java for-i循环中
i++的效果,而如果你想跳过其中的一些元素,可以使用step关键字:

fun main() {
    for (i in 0 until 10 step 2) {
       println(i)
    }
}

这里相当于for-i循环中i = i + 2的效果

如果你想创建一个降序的区间,可以使用downTo关键字

fun main() {
   for (i in 10 downTo 1) {
        println(i)
   }
}

这里我们创建了一个[10, 1]的降序区间。降序区间也可以使用step语法