Kotlin基础教程
简介与安装
Kotlin自从17年开始就成了谷歌认证的安卓官方开发语言。Kotlin虽然也是运行在Java虚拟机中的语言,不过也可以编译成javascript,从而在没有JDK的情况下运行。
若只是想略作体验,那么可以尝试以下官网提供的在线编译器。此外,Android Studio中提供了Kotlin的编译环境,可以直接新建安卓项目,这个过程完全符合直觉,而且官网对每一个步骤都给出了截图,就不再赘述了。新建项目之后,Kotlin代码放在java目录下,后缀为.kt
的就是。
当然,相对来说命令行交互式操作更加适合初学者,所以只需要下载Kotlin编译器,这里给出的是1.3.5版本。下载之后解压到喜欢的文件夹,然后将bin
目录添加到环境变量。
输入命令kotlin
进入命令行交互环境;通过kotlin -h
可以查看编译器的操作方法。
>kotlin
Welcome to Kotlin version 1.8.20-RC2 (JRE 11.0.16.1+1-LTS)
Type :help for help, :quit for quit //帮助和退出命令,别忘了冒号
>>> println("hello kotlin")
println("hello kotlin")hello kotlin
>>> :quit //退出
变量和算术
和许多函数式语言一样,Kotlin将数据分成了变量和常量两种,分别用关键字var
和val
表示,其中val
声明的变量不可更改。
其数据类型包括Byte、Short、Int、Long等整数类型;Float、Double等浮点类型;字符类型Char;布尔类型Boolean;字符串String。数值类型之间可用转换函数互相转换,转换函数包括toByte
、toShort
等,其余类同,不再赘述。
>>> var One = 1 //这是变量
>>> val Two = 2 //这是常量
>>> One = 3
>>> Two = 3
error: val cannot be reassigned
Two = 3 //val声明的变量不可更改
>>> One.toByte()
One.toByte()res4: kotlin.Byte = 3
>>> One.toChar()
One.toChar()res5: kotlin.Char =
>>> One //toChar只会改变返回值的数据类型
res6: kotlin.Int = 3
在Kotlin中,数值运算、比较运算以及布尔运算都符合程序员的直觉,但定义了新的位运算函数,包括
shl(bits) | shr(bits) | ushr(bits) | and(bits) | or(bits) | xor(bits) | inv() |
---|---|---|---|---|---|---|
有符号左移 | 有符号右移 | 无符号右移 | 位与 | 位或 | 位异或 | 位非 |
下面略作演示,考虑到>>>
不利于复制粘贴,所以后续的示例代码均省略>>>
,而对其返回结果写在注释里,Kotlin
单行注释为//
,多行注释用//
。
3 shl 3 //3 向左移三位,相当于乘以8
// 返回结果 kotlin.Int = 24
函数
对于只需要一行表达式的函数,Kotlin
提供了非常简单的定义方法,例如
fun f(x:Int) = x*x
f(5) //f(5)res2: kotlin.Int = 25
这种写法简直和数学公式一样,非常直观,但其实是一种简化写法。完整的函数声明需要标明输入输出的数据类型,返回值的类型也需要声明,所以,若想实现上面的 f ( x ) = x 2 f(x)=x^2 f(x)=x2的功能,需要写为
fun f(x:Int):Int{return x*x
}
kotlin
中,可以通过参数名进行传参,且支持默认参数。函数如果没有返回值,则其返回类型为Unit
。
// 输入为两个整型,输出为一个整型
fun add(x:Int,y:Int):Int{return x+y}
add(y=3,x=4)
//结果: kotlin.Int = 7
fun add(x:Int=1,y:Int=2):Int{return x+y}//函数可以有默认参数
add()
//结果: kotlin.Int = 3
fun test(x:Char):Unit{println(x)} //无返回值的类型为Unit
test('y')
//将打印y
kotlin
支持lambda表达式,通过->
表示输入输出的变化关系,例如
{a:Int, b:Int -> a+b}(3,4)
//返回 kotlin.Int = 7
条件表达式
Kotlin
中,条件语句用if(){}else{}
表示,下面新建一个函数,里面通过条件表达式来判断输入参数的大小
fun compare(x:Int, y:Int):Int{if(x>y){println("x>y")return 1}else if(x<y){println("x<y")return -1}else{println("x==y")return 0}
}
然后测试一下
compare(1,2)
// 打印x<y
// 返回kotlin.Int = -1
在Kotlin
中,任何表达式都有返回值,if...else
亦然,其默认返回值为最后一行语句。也就是说,将上述函数改写为下面的形式,结果是完全相同的
fun compare(x:Int, y:Int):Int{return if(x>y){println("x>y")1}else if(x<y){println("x<y")-1}else{println("x==y")0}
}
此外,这种特性也提供了天然的三元表达式if() a else b
,从而可以非常方便地写一个递归的阶乘函数
fun fac(n:Int):Int{return if(n>1) n*fac(n-1) else 1}
fac(15)
//返回 kotlin.Int = 2004310016
循环语句
kotlin
中有for
循环和while
循环两种。while
循环的逻辑是,在某个循环条件成立的情况下,一直执行循环体的内容
var i = 0
while(i<10){println(i)i++
}
运行结果会打印出0
到9
的10个数字。
for
循环则需要遍历一个可迭代的数据结构,例如
for(i in 1..10){println(i)
}
其中1..10
将生成从1
到10
的自然序列,经由for
循环后,即对这10个数一次操作。
when表达式
kotlin
中的when
表达式类似于C语言中的switch...case
,示例如下
fun num2card(x:Int):String{return when(x){13 ->"K"12 ->"Q"11 ->"J"1 ->"A"else ->"$x"}
}
其中"$x"
可将作为数值的x
转化为字符串,下面测试一下
num2card(12)
//返回: kotlin.String = Q
num2card(3)
//返回: kotlin.String = 3
when
表达式非常灵活,对于when(flag){xxx -> yyy}
而言,只要flag xxx
能够构成一个可供判断的表达式,就可以执行。例如
when(flag){is String -> println("string")}
,表示flag
为String
时执行when(flag){in 1..5 -> println("1..5")}
,表示flag
为1,2,3,4,5
中任意一个时执行
此外,对于多个个例,可用逗号分隔
when(flag){1,2 -> println("1,2")}
,表示flag
为1,2
中任意一个时执行