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语法学习的主要内容,如果未能解决你的问题,请参考以下文章
Android:Kotlin详细入门学习指南-函数-基础语法