一、变量
Kotlin与Java区别很大,在Java中定义一个变量,需要在变量前声明这个变量的类型,比如 int a 表示a是一个整型变量,String b 表示 b 是一个字符串变量。
而Kotlin定义变量,只允许在变量前声明两种关键字:val 和 var 。
val ( value的简写 ) 用来声明一个不可变的变量,这种变量在初始赋值之后再也不能重新赋值,对应Java中的final变量。
var ( variable的简写 ) 用来声明一个可变的变量,这种变量在初始赋值之后仍然可以再重新赋值,对应Java中的非final变量。
Kotlin它拥有类型推导机制,比如我们使用val关键字定义一个变量a 并将a赋值10,这里a就会被推导成整数类型,把整数赋值给a,那么a就是整数变量,如果把字符串赋值给a,那么a就是字符串变量。 但是Kotlin的类推导机制并不总是可以正常工作的,比如定义一个延迟赋值的话,Kotlin就不能自动推导了,这时候需要显式声明变量类型才可以,Kotlin提供了一项功能 ,语法如下
val a:Int = 10
Kotlin放弃了Java中的基本数据类型,全部使用对象数据类型,在Java中的int是关键字,而在Kotlin中Int变成了一个类,它拥有自己的函数和继承结构。
二、函数
函数是运行代码的载体,Kotlin定义函数的规则如下
fun methodName(param1 :Int,param2:Int):Int{
return 0
}
fun ( function的缩写 ) 是定义函数的关键字,无论定义什么函数,都一定使用fun声明。
紧跟在fun后面的是函数名,函数名后面紧跟着一对括号,里面可以声明函数接受什么参数,参数的数量可以是任意多个,例如上述示例就表示该函数接受两个Int类型的参数,参数声明格式是 “参数名:参数类型”。参数括号后面那部分是可选的,用于声明该函数会返回什么类型的数据。
当一个函数只有一行代码时,Kotlin允许我们不必编写函数体,可以直接将唯一的一行代码写在函数定义的尾部,中间等号连接,语法如下:
fun largerNumber(num1 : Int , num2 : Int ):Int = max(num1,num2)
使用这种语法,return关键字也可以省略了,等号足以表达返回值的意思。另外Kotlin出色的类型推到机制,在这里还可以发挥作用。由于max()函数返回是一个Int值,而largerNumber()函数尾部又使用等号链接了max()函数,因此可以写如下语法:
fun largerNumber(num1 : Int , num2 : Int ) = max(num1,num2)
三、程序的逻辑控制
程序的执行语句主要分为3种:顺序语句、条件语句、循环语句。
if条件语句
Kotlin中条件语句主要有两种实现方式 if 和 when。
首先学习if,Kotlin中的if语句和Java中的几乎没区别。
fun largerNumber(num1 : Int,num2 : Int) :Int{
var value=0
if(num1>num2){
value=num1
}else{
value=num2
}
return value
}
这段代码大家都熟悉,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语句使用每个条件最后一行代码作为返回值,并将返回值赋值给了value变量。
其实value也是一个多余的变量,我们可以直接将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语句强大的多。
比如实现一个多条件判断 我们使用if来实现这个功能
fun getScore(name: String) = if (name == "Two") {
86
} else if (name == "Jim") {
77
} else if (name == "Jack") {
95
} else if (name == "Lily") {
100
} else {
0
}
这里定义了一个getScore()函数,这个函数接受一个学生姓名参数,然后通过if判断找到学生的分数并且返回。
这样写法确实可以实现我们想要的功能,写了很多if和else显得会冗余,这时可以使用when语句,语法如下:
fun getScore(name: String) = when (name) {
"Two" -> 86
"Jim" -> 77
"Jack" -> 95
"Lily" -> 100
else -> 0
}
when语句和if语句一样,也是可以有返回值的, 因此我们仍然可以使用单行代码函数的语法糖。
when语句允许传入一个任意类型的参数,然后可以在when的结构体中定义一系列的条件,格式如下:
匹配值 -> {执行逻辑}
当执行逻辑只有一行代码时,{}可以省略。
除了精准匹配之外,when 语句还允许类型匹配,语句如下:
fun checkNumber(num: Number) {
when(num){
is Int -> Log.d(TAG, "checkNumber: is Int")
is Double -> Log.d(TAG, "checkNumber: is Double")
else -> Log.d(TAG, "checkNumber: not support")
}
}
when 还有一种不带参数的用法,虽然这种写法可能不常用,但有时候却能发挥很强的扩展性。
fun getScore(name: String) = when {
name == "Two" -> 86
name == "Jim" -> 77
name == "Jack" -> 95
name == "Lily" -> 100
else -> 0
}
这里需要注意 kotlin中判断字符串或者对象可以直接使用==关键字,而不用像java那样调用equals()方法。
循环语句
熟悉Java的人应该知道,Java中主要有两种循环语句,while循环和for循环。而kotlin也提供了while循环和for循环,其中while循环不管是语法还是技巧都和java没有任何区别,所以不做讲解了。
java中最常用的for-i循环在kotlin中直接被舍弃了,而Java中另一种for-each循环则被kotlin大幅度的加强,变成了 for-in 循环。
先普及一个Kotlin概念:
val range = 0..10
这种语法和概念在Java中是没有的,在Kotlin里是用来表示一个区间,相当于创建了一个0到10的区间,并且两端都是闭区间,这意味着0到10这两个端点都是包括在这个区间中的,用数学的方式表达出来就是[0,10]。
其中..就是创建两端区间的关键字,在..的两边指定区间的左右端点就可以创建一个区间了。有了区间我们可以通过for-in遍历这个区间
for (i in 0..10) {
Log.d(TAG, "i:$i")
}
在很多情况下 双端闭区间却不如单端闭区间好用。有一种现象,数组的下表都是从0开始的,一个长度为10的数组它的下表区间是0到9,因此左闭右开的区间在程序中更加常用。Kotlin中可以使用until关键字来创建一个左闭右开的区间,如下所示:
val range = 0 until 10
表示创建了一个0到10的左闭右开区间,它的数学表达方式时[0,10)。使用until替代..关键字 ,你就会发现最后一行10不会再打印出来了。
默认情况下 for-in 循环每次都会在区间返回内递增1,相当于java for-i 循环中的i++ 效果一样,而如果想跳过其中某一元素,可以使用step关键字。
for (i in 0 until 10 step 2) {
Log.d(TAG, "i:$i")
}
上述代码表示在[0,10)这个区间的时候,每次循环都会在区间范围递增2,相当于for-i循环中i=i+2的效果。
..和until关键字 都要求区间的左端必须小于等于区间的右端,也就是这两种关键字创建都是一个升序的区间,如果想创建一个降序的区间可以使用 downTo关键字,这里我们创建一个 [10,1]的降序区间。
for (i in 10 downTo 1) {
Log.d(TAG, "i:$i")
}