![基于Kotlin的Spring Boot微服务实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/558/34667558/b_34667558.jpg)
3.1 基础语法
本节主要介绍Kotlin使用的基本数据类型、包名和引用、流程控制、返回和跳转等基础语法。
3.1.1 基本数据类型
Kotlin使用的基本数据类型包括:数值型、字符型、布尔型、数组和字符串。
数值型分为整数和浮点数。整数有8种类型,如表3.1所示。
表3.1 Kotlin中整数的类型
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-34-1.jpg?sign=1739541900-NljnbVM4fnjhdFZmeVLxCg76v82e2yMm-0-8e8c9ada6a9f888ef26f80db4a9328b3)
浮点数有Float和Double两种类型,如表3.2所示。
表3.2 Kotlin中浮点数的类型
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-35-1.jpg?sign=1739541900-GQlvaQEi67nhhulTRtQ2Ebv9ZOqh5MJN-0-e3807a0935ad1e93d726fe58a283e5ea)
Kotlin不允许隐式转换类型。例如,方法printDouble()的参数是Double类型的,调用该方法时,参数必须是Double类型的。每种类型都提供了如下显式转换方法。
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-35-2.jpg?sign=1739541900-cqcEzGP2uOUSLPpzXqwMf9VXtDKz2qa6-0-74a9af0af70e893e2eea6121bf048765)
注意:Long类型的数字的结尾有L,如123L。十六进制数以0X开头,如0X0F。二进制数以0b开头,如0b00001011。Float类型的数字的结尾有f或F。无符号数值,以u或U结尾。无符号长整数以uL或UL结尾。
数值也支持用“_”增强可读性,如下面的代码所示:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-36-1.jpg?sign=1739541900-VwqV1fY6l8Sy7P6jr4F83izKLEHX4aVF-0-f662616e42c6ec892b7079769cd01234)
注意:这些数值类型可为空时(例如,Int?),数值是包装类,其他情况下的数值是基本数据类型。包装类的值相等,但是内存地址不同,如下面的代码所示:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-36-2.jpg?sign=1739541900-wcE4U0Wr0zSe78Ww5Jn9QfBK3QifEgT2-0-f73cf18b54270fb1a607bdecc7d6ad98)
数值类型支持使用==、!=、>、<、>=、<=进行范围判断。此外,Int和Long类型的数值支持如下位运算。
shl(bits)—有符号数值左移
shr(bits)—有符号数值右移
ushr(bits)—无符号数值右移
and(bits)—按位与
or(bits)—按位或
xor(bits)—按位异或
inv()—按位取反
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-37-1.jpg?sign=1739541900-ZN9RacEduYgFoLQMoXbaPYoccmvSpsNv-0-f0a905ec2f4581eca7f770a394c2fc16)
字符类型的关键字是Char。字符类型用单引号,如'a'。字符类型不能直接转换为数值类型,需要进行显式转换。此外,如果字符类型可为空,其是包装类,而不是基本数据类型。
布尔类型的关键字是Boolean,只有两个取值true和false。如果布尔类型可为空,其也是包装类。布尔类型支持&&、||、!三种运算符。
数组类型的关键字是Array,可以用arrayOf()创建一个数组,例如,arrayOf(1,2,3)表示数组[1,2,3]。数组有get()和set()方法,可以用[]替代这两个方法,举例如下:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-37-2.jpg?sign=1739541900-glvACWpSQYePUqNIP6G2DmL9il3soPWe-0-bcc89809708143544b63d3ccb32f12fb)
Kotlin提供byteArray、shortArray和intArray等用于创建不同类型的数组。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-37-3.jpg?sign=1739541900-KvWET9DspDtjFKZpRPxFpSE7p6vT9qqE-0-8393935a8d5124bf55a1ef2ffdf37368)
String表示字符串。字符串是不可变对象,可以用[i]遍历每一个字符。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-37-4.jpg?sign=1739541900-Ozl04awX7aw0WMpcuCwfhfsHo6xPkFh6-0-0c628d157ae47746003b561dda6a8a83)
可以用“+”拼接字符串:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-1.jpg?sign=1739541900-xWgC4GDp1QV4eKKB9fe2WjVoagc1sAly-0-3a64b361d03c44b4600c9138d9cbea06)
字符串可以由"""分割,包含换行符:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-2.jpg?sign=1739541900-f3zk9J5O21UKDweebwraVj6DlsqsAQnM-0-b8c58d0eff38f9ccea62bb05a90bfdd6)
在上面这个例子中,每行都输出了很多空格,可以用trimMargin()方法去除空格,每行都有一个“|”前缀,也可以自定义前缀,如“>”,调用trimMargin(">")即可:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-3.jpg?sign=1739541900-DjaJq1EOlIZAvuab8HU4jpWid5aN8AUR-0-9578034e2df1c974d6d2a531c3dca514)
Kotlin的String支持模板,在字符串中使用"$"可嵌入模板:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-4.jpg?sign=1739541900-fUEoLlQ56w10Lnk0yZvuJCwKmhElu27e-0-fa240741b098b8ae9d102928f9ec9f2b)
如果需要单独使用$,可以参考如下代码来实现:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-5.jpg?sign=1739541900-WZ1UAz5gzcuXyLYlDgCFr7y5iereNhMD-0-f5eda34a544f5cb8777e784d4c653f90)
3.1.2 包名和引用
Kotlin的源码中一般都有一个包名,所有的类和方法等都在这个包下:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-39-1.jpg?sign=1739541900-guvzj13AE51znNbWccIZ2BUMaxn6rtGa-0-149c3b5852fc74fe005ba6b99bc6a23c)
在上面这个例子中,printMessage的全名是io.kang.chapter03.basicsyntax.printMessage,Message的全名是io.kang.chapter03.basicsyntax.Message。
每一个Kotlin文件在JVM平台中会默认引入如下包:
kotlin.*
kotlin.annotation.*
kotlin.collections.*
kotlin.comparisons.*(从1.1版本开始)
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
java.lang.*
kotlin.jvm.*
我们可以引入一个类,也可以引入包中的所有内容,为了避免命名冲突,还可以给引用起别名:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-39-2.jpg?sign=1739541900-eumh1wYzmDIS2wMnxev3Qwc3dr1936bL-0-e3ef43ebd70a630831ac769d1b060685)
3.1.3 流程控制
Kotlin的流程控制语句有if、when、for、while。if的分支可以是代码块,最后的表达式作为该块的值。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-40-1.jpg?sign=1739541900-sbcDuNYVNiIVGPU8bvtovM82bSm075N9-0-b677acca995defc0cd03a8076ccac01e)
when语句类似于switch,when将它的参数与所有的分支条件顺序比较,直到某个分支满足条件。when既可以被当作表达式使用,也可以被当作语句使用。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-40-2.jpg?sign=1739541900-w7wSYXC4MJ59ZCg63rf46rtSOU9TerXj-0-fecfe622b07bad875ded256ac224dce9)
for语句可以对任何提供迭代器(iterator)的对象进行遍历。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-40-3.jpg?sign=1739541900-uIw3QiVXIsGNkPEMoMaBudnTTQp6uWgG-0-fef8d34d344d1e1a4d0729ca2a86c5b6)
While、do…while在Kotlin中的用法和在Java中相同。
3.1.4 返回和跳转
Kotlin有以下三种跳转表达式:
return—默认从最直接包围它的函数或者匿名函数返回。
break—终止最直接包围它的循环。
continue—继续下一次最直接包围它的循环。
在Kotlin中,任何表达式都可以用标签(label)来标记。标签的格式为在标识符后跟@符号,例如abc@。可以用标签限制return、break、continue,举例如下:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-41-1.jpg?sign=1739541900-ljKYW8RdsBeJoT49mrVs3Kv377QwhRJb-0-4bf2f206e241a3bae376521cef02b0f9)