Kotlin:05-控制流 if、when、for、while
一、if 表达式
在 Kotlin 中,if 既可以作为普通的判断语句使用,也可以作为表达式使用。 当 if 作为表达式使用时,本身就会有返回值,其效果等同于 java 中的三元运算。
我们来看使用 if 语句 获取两个值中较大值的代码,如果按照 java 中的模式,我们应该这么写:
fun getMaxVal1(a: Int, b: Int) {
var max: Int
if (a > b) {
max = a
} else {
max = b
}
}
但是,我们已经知道了,在 kotlin 中,if 作为表达式时有返回值,效果等同于 java 中的三元运算,所以,我们获取两个值中较大值的代码就可以这么写:
fun getMaxVal2(a: Int, b: Int) {
var max = if (a > b) a else b //这种方式等同于 java 中的 三元运算
}
这样是不是感觉很清新?
注意:
- 作为表达式使用时,其性质等同于 java 中的三元运算,必须要有 else 字段
另外,作为表达式使用时,if 和 else 分支后面不仅能跟普通的值,也可以跟代码块。如:
val max = if (a > b) { //作为表达式使用时,我们跟了一段代码块,
print("Choose a")
a
} else {
print("Choose b")
b
}
向上面的这段代码中,我们将 if 作为表达式使用,并且在 if 和 else 分支后面跟了一段代码块,这样,我们不但能将 较大的值赋值给 max , 还能在同时做其他的操作 -- 这里是打印了一句话。
二、When 表达式
(一)、主要特点:
kotlin 中 ,When 的主要特点如下:
- When 类似于 java 中的 switch ,但是功能比 switch 更为强大。
-
When 既可以当做表达式使用,也可以当做语句使用。
- 当做语句使用时,效果等同于 java 中的 switch
- 当做表达式使用时,会有返回值,符合条件的分支的值就是整个表达式的值。
- **将 when 当做表达式使用时, 必须要有 else 分支,
- when 的各个分支不仅可以是常量,也可以是表达式**。
-
如果多个分支有相同的处理方式,则可以把多个分支条件放在一起,用逗号分隔。(
这种方式类似于 java 中 switch 语句的穿透
)
(二)、用法示例
好了,我们已经知道了 when 的主要特点,那么接下来就看下 when 的具体用法:
示例1、when 的基本使用格式
fun main(arg: Array<String>) {
whenFunc1(6)
}fun whenFunc1(a: Int) { //基本使用格式示例
when (a) {
1 -> println("传入的值是1")
2 -> println("传入的值是2")
else -> {
println("传入的值既不是1 也不是2")
}
}
}
示例2、多分支共用一种处理(分支穿透)
fun whenFunc2(a: Int) {
when (a) {
1, 2 -> println("传入的是1 或者是2") //分支穿透
else -> {
println("传入的既不是1 也不是2")
}
}
}
示例3、以表达式(而不只是常量)作为分支条件
fun whenFunc3(a: Int) {
when (a) {
sum(3, 3) -> print("a 的值是 ${sum(3, 3)}") //以表达式作为分支,实际是以表达式的值作为分支条件
else -> print("我哪里知道分支值是多少")
}
}
在上面的代码中,我们 使用 Integer.sum(a,b) 方法作为 when 的分支条件,实际就是以 sum 的值作为分支条件。
示例4、将When 作为 if..else if 使用
A : 检测某个值是否在区间或者集合中
- 判断某个值是否在 XXX 中的关键字 是 in
- 判断某个值是否在 XXX 中的关键字 是 !in
- 区间 就是指一个数据范围,在高中数学中有相应介绍。
- 区间分为开区间 、闭区间 、半开区间 。
- 开区间的表示方式为 ( a , b ) , 表示该范围内的数据 自 a 开始 到 b 结束,但不包含 a 和 b
- 闭区间的表示方式为 [ a , b ] , 表示该范围内的数据 自 a 开始到 b 结束,包含 a 和 b
- 半开区间有两种方式:( a , b ] 和 [ a ,b ) 。前者表示不包含 a 但是 包含 b , 后者表示 包含 a 但不包含 b
fun whenFunc4(a: Int) {
when (a) {
in 1..5 -> println("$a 在 1..5 的区间之内")
!in 10..15 -> println("$a 不在 10..15 的区间之内")
else -> println("$a 在 10..15 的区间之内")
}
}
上面的代码中,我们演示了判断一个值是否在区间之内,当然也可以判断值是否在某个集合中,关于集合的内容后面会有讲解。
B : 检测某个值是否是某种类型
- 检测某个值是某种类型的关键字是 is
- 检测某个值不是某种类型的关键字是 “!is”
fun whenFunc5(a: Int?) {
when (a) {
is Int -> println("$a 是 Int 类型的数据")
else -> println("$a 不是 Int 类型的数据")
}
}
C :when 后面也可以不跟参数
如果不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支:
fun whenFunc6(a: Int) {
when { //此处未跟参数,所以分支条件必须是 简单的 boolean 表达式
a < 6 -> println("$a 小于6")
a == 6 -> println("传入的值是6")
else -> println("$a 大于6")
}
}
三、 For 循环
(一)、for 循环的特点
Kotlin 中的 for 循环可以对任何提供迭代器(iterator)的对象进行遍历,等同于 java 中的 foreach 循环。
for 可以循环遍历任何提供了迭代器的对象。也就是说:
- 该对象中必须有一个 iterator( ) 函数,可以是它自己声明的也可以是继承自父类的。
- iterator( ) 必须有返回值。假设该返回值的对象类为A
- 对象类 A 中 必须有 next( ) 函数,可以是它自己声明的也可以是继承自父类的
- 对象类 A 中 还必须有 hasNext( ) 函数,该函数的返回值 为 Boolean类型
- 而且以上这三个函数都需要标记为 operator 。也就是说这三个方式需要是公共的,可以被其他类访问的。
(二)、for 循环的基本语法
for 循环的基本语法如下:
for (item in collection)
print(item)
循环体可以是一个代码块:
for (item: Int in ints) {
// ......代码块......
}
示例1:遍历获取数组中的数据
fun forFunc1() {
var nums = arrayOf(1, 2, 3, 4, 5, 6, 7) //创建数组
for (num in nums) { //遍历并打印数据
println(num)
}
}
示例2:遍历数组中的索引
fun forFunc2() {
var nums = arrayOf(1, 2, 3, 4, 5)
for (index in nums.indices) { //遍历数组的索引
println(nums[index]) //打印根据索引获得的数据
}
}
遍历索引时,需要使用 Array.indices( ) 函数 ,该函数返回的是 数组的索引区间。indices( ) 源码如下:
/**
* Returns the range of valid indices for the array.
*/
public val <T> Array<out T>.indices: IntRange
get() = IntRange(0, lastIndex)
所以,遍历索引的本质就是区间的遍历。
示例3、同时遍历数据和索引
fun forFunc3() {
var nums = arrayOf(1, 2, 3, 4, 5)
for ((num, index) in nums.withIndex()) {
println("索引 $index 对应的数据是 $num")
}
}
同时遍历数据和索引时,需要使用 Array.withIndex( ) 函数。
(三)、补充:forEach
kotlin中遍历的时候,我们也可以使用 forEach ( ){ }, 需要注意的是:
使用 forEach 函数时, 被遍历到的数据 使用固定的字符 it 表示。
示例代码如下:
fun forFunc4() {
var nums = arrayOf(1, 2, 3, 4, 5)
nums.forEach { //forEach 遍历到的数据使用固定的 it 代表
println("nums 中的数据包含 $it")
}
}
在上面的代码中,我们使用 forEach 遍历了数组中的数据,在println("nums 中的数据包含 $it")
中,it 就代码每次遍历到的具体数据。
四、While 循环
Kotlin 中的 while 和 do...while 与java中的并没有区别,使用的方式是一致的。所以,不在赘述 ,可参考下面示例代码:
示例1:
fun whileFunc1() {
var a = 10
while (a > 0) {
println("当前a 的值是 $a")
a--
}
}
示例2:
fun whileFunc2() {
var a = 10
do {
println("当前 a 的值是 $a")
a--
} while (a > 0)
}
本文到此结束,谢谢观看!
- 34c3 部分Web Writeup
- 原来Oracle也不喜欢“蜀黍"(r6笔记第54天)
- Java基础19(01)总结IO流,异常try…catch,throws,File类
- 使用shell生成orabbix自动化配置脚本(r6笔记第53天)
- 现在 tensorflow 和 mxnet 很火,是否还有必要学习 scikit-learn 等框架?
- 数据的标准化与中心化以及R语言中的scale详解
- Java基础19(02)总结IO流,异常try…catch,throws,File类
- HTML5 — header
- 两条报警信息的分析(第二篇)(r6笔记第71天)
- 两条报警信息的分析(第一篇) (r6笔记第70天)
- R-求y=sin(X) 0-PI 面积代码
- Facebook 发布 wav2letter 工具包,用于端到端自动语音识别
- Java企业面试——Java基础
- 从Java的类型转换看MySQL和Oracle中的隐式转换(二)(r6笔记第68天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- mysql 数据库的悲观锁和乐观锁
- C语言 二维数组和指针的一些笔记
- Java SpringBoot2.3.4 配置redis 基于lettuce 同时支持集群与单机 配置密码加密 并使用redisson分布式锁
- 使用elasticsearch-dump迁移elasticsearch集群数据
- Python爬虫之scrapy的入门使用
- 告别传统工业互联网,提高数字管控思维:三维组态分布式能源站
- 爱奇艺iOS移动端网络优化实践:请求成功率优化
- Java数据类型
- Python爬虫之scrapy构造并发送请求
- Python爬虫之scrapy模拟登陆
- Python爬虫之scrapy中间件的使用
- Python爬虫之scrapy_redis原理分析并实现断点续爬以及分布式爬虫
- Python爬虫之scrapy_splash组件的使用
- Python爬虫之scrapy的日志信息与配置
- Python爬虫之scrapyd部署scrapy项目