不论身处何方 for循环这种操作都随处可见,鉴于大多数Android开发都是从Java转到Kt的,所以我的思路是从Java的使用习惯来讲一些Kt 的for、forEach 循环方式
基础 for循环
for循环 一般作用于list、map数据集合,这里我直接创建了一个只读List集合
val dataList = listOf("apple", "banana", "orange")
val numList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
提前了解
//Java中获取list循环数据的方式
dataList.get(i)
//Java中获取数组数据的方式
dataList[i]
//在Kt中不论是集合还是数组都用以下方式
dataList[i]
惯性 for循环
所谓的惯性思维,指的是从Java过渡的常规for循环思想,均是循环获取角标,然后根据角标取对应值;如下
for (int i = 0; i < list.size(); i++) { }
惯性方式1:在 Kt 中,通常使用 start .. end 来代表一段区间 ,如下就是类似Java的写法,定义一个变量,循环区间定义在 0 - List.size - 1,循环时获取list中每个索引的值
fun basicsFor1(dataList: List<String>) {
for (i in 0..dataList.size - 1) {
println("basicsFor1:" + dataList[i])
}
}
惯性方式2:使用Ranges.kt下的until来代表循环区间,从而完成 for循环
fun basicsFor2(dataList: List<String>) {
for (i in 0 until dataList.size) {
println("basicsFor2:" + dataList[i])
}
}
输出结果
com.example.fordemo I basicsFor1:apple
com.example.fordemo I basicsFor1:banana
com.example.fordemo I basicsFor1:orange
com.example.fordemo I basicsFor2:apple
com.example.fordemo I basicsFor2:banana
com.example.fordemo I basicsFor2:orange
有的人可能发现 dataList.size 没有-1,这样会不会造成数组越界?我们看一下 Int 的 until 扩展函数,你会发现在其内部也是封装了区间处理,故使用无忧
进阶 for循环
Look:以下俩种方式都很常用,可根据需求自行选取
进阶方式1
:使用Collections .kt
下的indices
来代表循环区间,从而完成 for循环
fun basicsFor3(dataList: List<String>) {
for (i in dataList.indices) {
println("basicsFor3:" + i)
println("basicsFor3:" + dataList[i])
}
}
同上疑问,我们看一下 Collection 的 indices扩展属性
,你会发现在其内部也是封装了循环区间
,故亦无忧
输出结果
com.example.fordemo I basicsFor3:0
com.example.fordemo I basicsFor3:apple
com.example.fordemo I basicsFor3:1
com.example.fordemo I basicsFor3:banana
com.example.fordemo I basicsFor3:2
com.example.fordemo I basicsFor3:orange
进阶方式2:这种方式应该是最快捷的一种循环方式,从循环区间的定义到值的输出都很方便,但是如果需要角标做一些其他操作的话,并不太适合,可用上者~
fun basicsFor4(dataList: List<String>) {
for (i in dataList) {
println("basicsFor4:$i")
}
}
输出结果
com.example.fordemo I basicsFor4:apple
com.example.fordemo I basicsFor4:banana
com.example.fordemo I basicsFor4:orange
倒序 for循环
之前的 for循环
方式都是正序的,在一些场景下我们需要倒序,故此也可以学一学
/**
* 倒序
* */
fun invertedFor(numList: List<Int>) {
for (i in numList.size - 1 downTo 0) {
println("invertedFor:" + numList[i])
}
}
没事儿看看 downTo
的源码,发现也是一个区间定义
输出结果
com.example.fordemo I invertedFor:10
com.example.fordemo I invertedFor:9
com.example.fordemo I invertedFor:8
com.example.fordemo I invertedFor:7
com.example.fordemo I invertedFor:6
com.example.fordemo I invertedFor:5
com.example.fordemo I invertedFor:4
com.example.fordemo I invertedFor:3
com.example.fordemo I invertedFor:2
com.example.fordemo I invertedFor:1
————————————————
版权声明:本文为CSDN博主「远方那座山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20451879/article/details/128580850