摘要:最近在看郭霖大神的书《第一行代码-第三版》,由于谷歌喊出“Kotlin first”的口号也已经有些时日,本人也一直也想学习下使用Kotlin编写Android程序,但无奈今年公司的业务没什么Android程序可开发,Kotlin也是学过就忘,在改需求时,也没有时间去重新熟悉Kotlin,没有办法使用Kotlin来直接写新需求。看了《第一行代码-第三版》这本书后,觉得里面关于Kotlin的知识讲的简洁明了而且很有调理,我就抽空将书中关于Kotlin的知识的精华部分记录了一下,方便日后学习使用。
1. 变量
1.1 变量声明
val:(value)简写,用来声明一个不可变的变量,赋值之后不可重新赋值,对应java中的final变量。
var:(variable)简写,用来声明一个可变的变量。
fun main(){
val a = 5
println(a = ${a})//a = 5
a = a * 10 // 报错,可改为 var a = 5;
}
Kotlin虽然拥有出色的类推导机制,但是有时我们不得不在声明变量时,指定变量类型
fun main(){
val a : Int = 5 //声明a为Int型变量
println(a = ${a})//a = 5
}
1.2 字符串内嵌表达式
上段代码中,println(a = ${a})//a = 5是我们在Java中不曾见到的写法,但是Kotlin却支持这样的字符串内嵌表达式,它允许我们在字符串里嵌入 ${ } 这种语法结构的表达式,并在运行的时候使用表达式执行的结果代替这一部分内容。
var str :String = "hello, ${obj.name}, nice to meet you"
当表达式中只有一个变量的时候,我们还可以将两边的打括号省略:
var name = obj.name
var str :String = "hello, $name, nice to meet you"
2. 函数
//格式
fun methodName(param1:Int,param2:String) : Int{
//声明第一个参数为Int,第二个参数为String类型,返回值为Int类型的函数
}
//获取两个数中较大的一个并返回
fun getLargeNum(a: Int, b: Int) :Int {
return max(a,b)
}
语法糖:当函数中只有一行代码时,我们可以不写函数体,将唯一一行代码写在函数尾部即可。
//获取两个数中较大的一个并返回
fun getLargeNum(a: Int, b: Int) :Int = max(a,b)
由于函数max()返回一个Int值,并且此函数只有一行代码,所以返回值类型也可以省略。
//获取两个数中较大的一个并返回
fun getLargeNum(a: Int, b: Int) = max(a,b)
在Kotlin中,我们还可以为函数的参数设置默认值例如:
fun printParams(num: Int, str: String = "hello"){
println("num is $num, str is $str")
}
这样我么在调用printParams的时候,可以只传第一个参数,第二个参数可传可不传。
fun main() {
printParams(5)
}
//num is 5, str is hello
这时大家可能会有疑惑,刚才恰好我们是最后一个参数拥有默认值,如果我么第一个参数拥有默认值,显然调用时是不能这么传参的,因为编译器并不知道你传的参数是要赋值给哪一个形参。不过不用担心,Kotlin提供了另外一种机制,就是可以通过键值对的方式来传参,比如我们可以这么写:
fun main() {
printParams(str = "hello")
}
fun printParams(num: Int = 5, str: String){
println("num is $num, str is $str")
}
//num is 5, str is hello
2.1 vararg
vararg对应的是Java中的可变参数列表,我们允许向这个方法传入多个同样类型的参数。这些参数都会被赋值到vararg声明的这个变量上面,然后用循环可以将传入的所有参数遍历出来,示例如下:
fun max(vararg nums:Int) : Int{
var max = Int.MIN_VALUE
for (num in nums){
max = kotlin.math.max(max,num)
}
return max
}
fun main() {
var max = max(1,2,4,5)
println("max = $max")
}
//max = 5
Kotlin中max()函数,只能比较两个数字大小,我们自己封装max()函数,接收若干个Int类型参数,然后再用循环比较,就可以找出若干个整型数字中最大的数了。
3. 语法
3.1 if 语句
常规用法
//获取两个数中较大的一个并返回
fun getLargeNum(a: Int,b: Int) : Int{
var large = 0;
if(a > b ){
large = a
}else {
large = b
}
return large
}
不同于java之处,kotlin中if可以有返回值,返回if语句每一个条件中最后一行代码的值。
//获取两个数中较大的一个并返回
fun getLargeNum(a: Int,b: Int) : Int{
var large = if(a > b ){
a
}else {
b
}
return large
}
由于large为多余的变量,并且此函数只有一行代码,因此,可以简写为:
//获取两个数中较大的一个并返回
fun getLargeNum(a: Int, b: Int) = if (a > b) { a } else { b }
//继续精简
fun getLargeNum(a: Int, b: Int) = if (a > b) a else b
3.2 when 语句
Kotlin中的when语句,有些类似于java中的switch语句,而switch语句完全可以用if…elseif…else代替
when语句语法:匹配值 -> { 执行逻辑 }
//只有一行代码时{}可以省略
fun getScore(name: String) = when (name) {
"Tom" -> 86
"Jim" -> 77
"Jack" -> 95
"Lily" -> 100
else -> 0
}
when语句在使用时,我们可以不用将参数传入when语句:
//只有一行代码时{}可以省略
fun getScore(name: String) = when {
name.startsWith("Tom") -> 86
name == "Jim" -> 77
name == "Jack" -> 95
name == "Lily" -> 100
else -> 0
}
除了精确匹配之外,when语句还允许进行类型匹配。
//is 相当于 java 中的 instanceof 关键字,
fun checkNumber(num: Number) {
when (num) {
is Int -> println("number is Int")
is Double -> println("number is Double")
else -> println("number not support")
}
}
3.3 循环(for-in)与区间
我们都知道,Java中有while和for两种循环,Kotlin同样提供了while和for两种循环,while 循环和Java完全一致,不同的是Kotlin舍弃了for-i循环,使用的是for-each循环的增强版本for-in,下面我们结合区间的概念,学习一下for-in的用法。
我们可以使用如下Kotlin代码来表示一个区间:
val range = 0..10
上述代码表示创建了一个0到10的区间,并且两端都是闭区间,这意味着0到10这两个端点都是包含在区间中的,用数学的方式表达出来就是[0, 10]。
也可以使用until关键字来创建一个左闭右开的区间:
val range = 0 until 10
上述代码表示创建了一个0到10的左闭右开区间,它的数学表达方式是[0, 10)。有了区间之后,我们就可以通过for-in循环来遍历这个区间:
fun main() {
for (i in 0..5) {
println(i)
}
}
//输出 0 1 2 3 4 5
如果你想跳过其中的一些元素,可以使用step关键字:
fun main() {
for (i in 0 until 10 step 2) {
println(i)
}
}
//输出 0 2 4 6 8
如果你想创建一个降序的区间,可以使用downTo关键字:
fun main() {
for (i in 5 downTo 1) {
println(i)
}
}
//输出 5 4 3 2 1
for-in除了可以对区间进行遍历之外,还可以用于遍历数组和集合: Kotlin-集合与Lambda编程map,filter,any,all函数的使用(第一行代码Kotlin学习笔记3))