- 基于Kotlin的Spring Boot微服务实战
- 袁康
- 884字
- 2020-11-24 13:00:58
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=1739189082-9vHELuHIHEFzJVcGpAYU3Lk85ag0qoND-0-6bc9b788243c12676c8434bcd4f043ab)
浮点数有Float和Double两种类型,如表3.2所示。
表3.2 Kotlin中浮点数的类型
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-35-1.jpg?sign=1739189082-GnXzrsC5mpzGoHr9MpMsRiAqmvBdCjgc-0-fa63f1efe58b4cb89295780f8c2d147e)
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=1739189082-4331hl50JmtglBhsdXLcxMTl3AOQIoDZ-0-a0fb97b08361c4d4368f181a0c363c24)
注意: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=1739189082-yk94JXfeS0L9EECC2RASOBZsb6QihEEY-0-6b2d1a44b192f4f68e9e2ff6d85e5086)
注意:这些数值类型可为空时(例如,Int?),数值是包装类,其他情况下的数值是基本数据类型。包装类的值相等,但是内存地址不同,如下面的代码所示:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-36-2.jpg?sign=1739189082-x0tcaheRxWgysDOE1fLgztXXb1NSn9SZ-0-ee468f7dbaa3de8db374fd99e0b186e5)
数值类型支持使用==、!=、>、<、>=、<=进行范围判断。此外,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=1739189082-fZp0L5YXNy15jH2bFpwOwhzVMXspsAGy-0-1b599fb45ff74b37997ec7ca6c377a67)
字符类型的关键字是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=1739189082-4Srtf9WyA46Dutg1UHn4kT5EJRnAJxhe-0-ec4713240e0df171404fba7461f89168)
Kotlin提供byteArray、shortArray和intArray等用于创建不同类型的数组。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-37-3.jpg?sign=1739189082-RY27cSZks50ACdIYCPjrbQezsT8PSWqO-0-d2aa70f24a2ed6004785aa0dea73f89c)
String表示字符串。字符串是不可变对象,可以用[i]遍历每一个字符。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-37-4.jpg?sign=1739189082-sNBDElYgUNTSHgR2lnorB5isP1Gi9i4U-0-6300a6594fa4fb94fec960246fbd3bdc)
可以用“+”拼接字符串:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-1.jpg?sign=1739189082-oHjVaFlMHfN8AHqiqiBQXj9VleiE0PWo-0-a445123a12932c9ae6e08f4e97f3456d)
字符串可以由"""分割,包含换行符:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-2.jpg?sign=1739189082-YLGpbAeq0qlzxT7vtncIGI8qDkaTvfje-0-1b85d78c50af86ad23af55254148398c)
在上面这个例子中,每行都输出了很多空格,可以用trimMargin()方法去除空格,每行都有一个“|”前缀,也可以自定义前缀,如“>”,调用trimMargin(">")即可:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-3.jpg?sign=1739189082-K7MJpW82rxKtMXH1vKPkmvt29DqPZNEC-0-82e7819b73d65cef1e82225ee2e0f2ad)
Kotlin的String支持模板,在字符串中使用"$"可嵌入模板:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-4.jpg?sign=1739189082-mnbjwmkBgdRoruNnthxA69EJyLApIQ8L-0-c2563bf1b75f5c5d1a1b21b0ffe5e6a3)
如果需要单独使用$,可以参考如下代码来实现:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-38-5.jpg?sign=1739189082-SIjftqhCiTCnGc2irjzDQ1EC47MCwYtR-0-63f0f08fc8d471a89dbfddbef8714649)
3.1.2 包名和引用
Kotlin的源码中一般都有一个包名,所有的类和方法等都在这个包下:
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-39-1.jpg?sign=1739189082-DShA39SQBAcaUcKDMocEzz99lJWOZJSt-0-ccdbeccb29ce3f7d2c33c2f941f3a80c)
在上面这个例子中,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=1739189082-VuL5KzkXx8e0uQOwab7xMpkACaLGJkXK-0-c96f55e9246d88d5ff29ed91efbf3a11)
3.1.3 流程控制
Kotlin的流程控制语句有if、when、for、while。if的分支可以是代码块,最后的表达式作为该块的值。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-40-1.jpg?sign=1739189082-jMMSJkMU8aLchbu6pAevBPgJZtINnNR4-0-982d443d2f3f47ba85b6f9c9986ca8b1)
when语句类似于switch,when将它的参数与所有的分支条件顺序比较,直到某个分支满足条件。when既可以被当作表达式使用,也可以被当作语句使用。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-40-2.jpg?sign=1739189082-f0mShaJ37g9FzfoViN4QL0DVFrYgUWjM-0-352d15c7327df32ebe497505c75c789e)
for语句可以对任何提供迭代器(iterator)的对象进行遍历。
![](https://epubservercos.yuewen.com/CD9CCF/18519309308427806/epubprivate/OEBPS/Images/39715-00-40-3.jpg?sign=1739189082-xFM7J5qKtRXD7lxUzIvdrizwOPb48uOe-0-5ba0f8d7c5f81f6d83f7029be1f6c3b5)
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=1739189082-xXe37JdY3JKksHPZgDk0bJsOXVYkKeni-0-6353ae1b0f213e0c904d4ef1ad675d59)