不論身處何方 for循環(huán)這種操作都隨處可見,鑒于大多數(shù)Android開發(fā)都是從Java轉(zhuǎn)到Kt的,所以我的思路是從Java的使用習慣來講一些Kt 的for、forEach 循環(huán)方式
基礎 for循環(huán)
for循環(huán)
一般作用于list、map數(shù)據(jù)集合
,這里我直接創(chuàng)建了一個只讀List集合
val dataList = listOf("apple", "banana", "orange")
val numList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
提前了解
//Java中獲取list循環(huán)數(shù)據(jù)的方式
dataList.get(i)
//Java中獲取數(shù)組數(shù)據(jù)的方式
dataList[i]
//在Kt中不論是集合還是數(shù)組都用以下方式
dataList[i]
慣性 for循環(huán)
所謂的慣性思維,指的是從Java過渡的常規(guī)for循環(huán)思想,均是循環(huán)獲取角標,然后根據(jù)角標取對應值;如下
for (int i = 0; i < list.size(); i++) { }
慣性方式1
:在 Kt
中,通常使用 start .. end 來代表一段區(qū)間
,如下就是類似Java的寫法,定義一個變量,循環(huán)區(qū)間定義在 0 - List.size - 1,循環(huán)時獲取list中每個索引的值
fun basicsFor1(dataList: List<String>) {
for (i in 0..dataList.size - 1) {
println("basicsFor1:" + dataList[i])
}
}
慣性方式2
:使用Ranges.kt
下的until
來代表循環(huán)區(qū)間,從而完成 for循環(huán)
fun basicsFor2(dataList: List<String>) {
for (i in 0 until dataList.size) {
println("basicsFor2:" + dataList[i])
}
}
輸出結(jié)果
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
有的人可能發(fā)現(xiàn) dataList.size 沒有-1,這樣會不會造成數(shù)組越界
?我們看一下 Int 的 until 擴展函數(shù)
,你會發(fā)現(xiàn)在其內(nèi)部也是封裝了區(qū)間處理,故使用無憂
進階 for循環(huán)
Look:以下倆種方式都很常用,可根據(jù)需求自行選取
進階方式1
:使用Collections .kt
下的indices
來代表循環(huán)區(qū)間,從而完成 for循環(huán)
fun basicsFor3(dataList: List<String>) {
for (i in dataList.indices) {
println("basicsFor3:" + i)
println("basicsFor3:" + dataList[i])
}
}
同上疑問,我們看一下 Collection 的 indices擴展屬性
,你會發(fā)現(xiàn)在其內(nèi)部也是封裝了循環(huán)區(qū)間
,故亦無憂
輸出結(jié)果
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
:這種方式應該是最快捷的一種循環(huán)方式
,從循環(huán)區(qū)間的定義到值的輸出都很方便,但是如果需要角標做一些其他操作的話,并不太適合,可用上者
~
fun basicsFor4(dataList: List<String>) {
for (i in dataList) {
println("basicsFor4:$i")
}
}
輸出結(jié)果
com.example.fordemo I basicsFor4:apple
com.example.fordemo I basicsFor4:banana
com.example.fordemo I basicsFor4:orange
倒序 for循環(huán)
之前的 for循環(huán)
方式都是正序的,在一些場景下我們需要倒序,故此也可以學一學
/**
* 倒序
* */
fun invertedFor(numList: List<Int>) {
for (i in numList.size - 1 downTo 0) {
println("invertedFor:" + numList[i])
}
}
沒事兒看看 downTo
的源碼,發(fā)現(xiàn)也是一個區(qū)間定義
輸出結(jié)果
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
forEach循環(huán)
眾所周知在Java中提供了forEach
循環(huán),同理Kt也支持使用forEach
循環(huán);使用時都是通過 list.forEach...
方式,來看一看提供的方法有forEach
、forEachIndexed
,主要區(qū)別在于是否需要index角標
,其余都是重載方法~
forEach
fun forEach(dataList: List<String>) {
dataList.forEach {
println(it)
}
}
輸出結(jié)果
com.example.fordemo I apple
com.example.fordemo I banana
com.example.fordemo I orange
也可以直接用 區(qū)間+forEach循環(huán),以下為示例...
整數(shù)型的集合,可以免創(chuàng)建list
fun forEach() {
(0..6).forEach{
println(it)
}
}
輸出結(jié)果
com.example.fordemo I 0
com.example.fordemo I 1
com.example.fordemo I 2
com.example.fordemo I 3
com.example.fordemo I 4
com.example.fordemo I 5
com.example.fordemo I 6
其他類型需要聲明對應的集合,可直接聲明全局list或傳參函數(shù)內(nèi)部
區(qū)間 (0..dataList.size - 1) + forEach
fun forEach(dataList: List<String>) {
(0..dataList.size - 1).forEach {
println(dataList[it])
}
}
輸出結(jié)果
com.example.fordemo I apple
com.example.fordemo I banana
com.example.fordemo I orange
區(qū)間(dataList.indices)+ forEach
fun forEach() {
(dataList.indices).forEach {
println(dataList[it])
}
}
輸出結(jié)果
com.example.fordemo I apple
com.example.fordemo I banana
com.example.fordemo I orange
forEachIndexed
fun forEachIndexed(dataList: List<String>) {
dataList.forEachIndexed { index, it ->
println("角標=$index 元素=${it}")
}
}
輸出結(jié)果
com.example.fordemo I 角標=0 元素=apple
com.example.fordemo I 角標=1 元素=banana
com.example.fordemo I 角標=2 元素=orange
for循環(huán) step過濾
step 本意是跳過的意思
,之所以我說是過濾,只因個人感覺step也是過濾數(shù)據(jù)的一種方式而已
初淺看一下setp函數(shù)
,發(fā)現(xiàn)支持的入?yún)⒕鶠檎麛?shù)型
,故下方案例我們都傳整數(shù)
常規(guī)開發(fā)中 step 跳過的數(shù)據(jù),一般是 setp數(shù)值*倍數(shù)(依次從1,2,3...) os:嘗試拋開角標的概念,單純從第幾個數(shù)的角度去看待這個場景
string集合
for (i in dataList.indices step 2) {
println("stepFor:" + dataList[i])
}
輸出結(jié)果
com.example.fordemo I stepFor:apple
com.example.fordemo I stepFor:orange
int集合
for (i in numList.indices step 2) {
println("stepFor:" + numList[i])
}
輸出結(jié)果
com.example.fordemo I stepFor:1
com.example.fordemo I stepFor:3
com.example.fordemo I stepFor:5
com.example.fordemo I stepFor:7
com.example.fordemo I stepFor:9
int集合(倒序)
for (i in numList.size-1 downTo 0 step 2){
println("stepFor:" + numList[i])
}
輸出結(jié)果
com.example.fordemo I stepFor:10
com.example.fordemo I stepFor:8
com.example.fordemo I stepFor:6
com.example.fordemo I stepFor:4
com.example.fordemo I stepFor:2
for循環(huán) 同時獲取index、數(shù)據(jù)
按照以前的常規(guī)方式,上方也有講過
fun basicsIndexItemFor(dataList: List<String>) {
for (index in dataList.indices) {
println("basicsIndexItemFor-index:" + index + " basicsIndexItemFor-item:" + dataList[index])
}
}
輸出結(jié)果
com.example.fordemo I indexItemFor-index:0 indexItemFor-item:apple
com.example.fordemo I indexItemFor-index:1 indexItemFor-item:banana
com.example.fordemo I indexItemFor-index:2 indexItemFor-item:orange
kt提供的方式(java可能也有)
/**
* 同時獲取對應角標(索引)和值,類似map吧
* */
fun indexItemFor(dataList: List<String>) {
for ((index, item) in dataList.withIndex()) {
println("indexItemFor-index:" + index + " indexItemFor-item:" + item)
}
}
輸出結(jié)果
com.example.fordemo I basicsIndexItemFor-index:0 basicsIndexItemFor-item:apple
com.example.fordemo I basicsIndexItemFor-index:1 basicsIndexItemFor-item:banana
com.example.fordemo I basicsIndexItemFor-index:2 basicsIndexItemFor-item:orange
for循環(huán) 多變量、多列表
kt 中的多列表循環(huán),主要用到了 zip
關鍵字關聯(lián)集合;這種方式是存在一定不足的,例如當前A列表內(nèi)部只存在3條數(shù)據(jù),B列表數(shù)據(jù)>3條,最后的結(jié)果就是B列表也僅會輸出前三條?。?!
/**
* 多變量、多列表循環(huán)
* */
fun doubleFor(dataList: List<String>,numList: List<Int>) {
for ((i, j) in dataList.indices.zip(numList.indices)) {
println("dataList:" + dataList[i] + " numList:" + numList[j])
}
}
輸出結(jié)果
com.example.fordemo I dataList:apple numList:1
com.example.fordemo I dataList:banana numList:2
com.example.fordemo I dataList:orange numList:3
kt 提供的這種場景,其實大致等同于以下的循環(huán)方式(拋開上面提到的不足)
fun doubleDataFor(dataList: List<String>) {
for (i in dataList.indices) {
println("dataList:" + dataList[i])
}
}
fun doubleNumFor(numList: List<Int>) {
for (i in numList.indices) {
println("numList:" + numList[i])
}
}
輸出結(jié)果
com.example.fordemo I dataList:apple
com.example.fordemo I dataList:banana
com.example.fordemo I dataList:orange
com.example.fordemo I numList:1
com.example.fordemo I numList:2
com.example.fordemo I numList:3
com.example.fordemo I numList:4
com.example.fordemo I numList:5
com.example.fordemo I numList:6
com.example.fordemo I numList:7
com.example.fordemo I numList:8
com.example.fordemo I numList:9
com.example.fordemo I numList:10
不知道有人會不會有人和我一樣懶,既然多列表循環(huán),用的角標值也一樣,能不能直接聲明一個變量就好...
事實就是提示用Pair
類~ 那么什么是Pair
類呢?
沒事兒做,一起看看zip源碼
- zip 函數(shù),返回的是
List <Pair<T, R>
- Pair類
- zip 實現(xiàn)
Pair
類+zip
多列表循環(huán)
fun doublePairFor(dataList: List<String>, numList: List<Int>) {
for (Pair in dataList.indices.zip(numList.indices)) {
println("dataList&numList:$Pair")
println("dataList&numList:"+dataList[Pair.first]+"-"+numList[Pair.second])
}
}
輸出結(jié)果
com.example.fordemo I dataList&numList:(0, 0)
com.example.fordemo I dataList&numList:apple-1
com.example.fordemo I dataList&numList:(1, 1)
com.example.fordemo I dataList&numList:banana-2
com.example.fordemo I dataList&numList:(2, 2)
com.example.fordemo I dataList&numList:orange-3
總結(jié)
首先,我寫的這些 for循環(huán)
都是木有問題的,都循環(huán)的很漂亮,知悉一下哈~
Demo 源碼
package com.example.fordemo
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private val dataList = listOf("apple", "banana", "orange")
private val numList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
basicsFor1(dataList)
basicsFor2(dataList)
basicsFor3(dataList)
basicsFor4(dataList)
invertedFor(numList)
stepFor()
indexItemFor(dataList)
basicsIndexItemFor(dataList)
doubleFor(dataList, numList)
doubleDataFor(dataList)
doubleNumFor(numList)
doublePairFor(dataList, numList)
forEach(dataList)
forEachIndexed(dataList)
}
/**
* step
* */
private fun stepFor() {
for (i in dataList.indices step 2) {
println("stepFor:" + dataList[i])
}
for (i in numList.indices step 2) {
println("stepFor:" + numList[i])
}
for (i in numList.size - 1 downTo 0 step 2) {
println("stepFor:" + numList[i])
}
}
private fun forEach(dataList: List<String>) {
dataList.forEach {
println(it)
}
}
private fun forEachIndexed(dataList: List<String>) {
dataList.forEachIndexed { index, it ->
println("角標=$index 元素=${it}")
}
}
private fun basicsFor1(dataList: List<String>) {
for (i in 0..dataList.size - 1) {
println("basicsFor1:" + dataList[i])
}
}
private fun basicsFor2(dataList: List<String>) {
for (i in 0 until dataList.size) {
println("basicsFor2:" + dataList[i])
}
}
private fun basicsFor3(dataList: List<String>) {
for (i in dataList.indices) {
println("basicsFor3:" + i)
println("basicsFor3:" + dataList[i])
}
}
private fun basicsFor4(dataList: List<String>) {
for (i in dataList) {
println("basicsFor4:$i")
}
}
/**
* 倒序
* */
private fun invertedFor(numList: List<Int>) {
for (i in numList.size - 1 downTo 0) {
println("invertedFor:" + numList[i])
}
}
/**
* 同時獲取對應角標(索引)和值,類似map吧
* */
private fun indexItemFor(dataList: List<String>) {
for ((index, item) in dataList.withIndex()) {
println("indexItemFor-index:" + index + " indexItemFor-item:" + item)
}
}
private fun basicsIndexItemFor(dataList: List<String>) {
for (index in dataList.indices) {
println("basicsIndexItemFor-index:" + index + " basicsIndexItemFor-item:" + dataList[index])
}
}
/**
* 多變量、多列表循環(huán)
* */
private fun doubleFor(dataList: List<String>, numList: List<Int>) {
for ((i, j) in dataList.indices.zip(numList.indices)) {
println("dataList:" + dataList[i] + " numList:" + numList[j])
}
}
private fun doubleDataFor(dataList: List<String>) {
for (i in dataList.indices) {
println("dataList:" + dataList[i])
}
}
private fun doubleNumFor(numList: List<Int>) {
for (i in numList.indices) {
println("numList:" + numList[i])
}
}
private fun doublePairFor(dataList: List<String>, numList: List<Int>) {
for (Pair in dataList.indices.zip(numList.indices)) {
println("dataList&numList:$Pair")
println("dataList&numList:" + dataList[Pair.first] + "-" + numList[Pair.second])
}
}
/* fun forMonth4(dataList: List<String>) {
repeat(3){
for (data in dataList.indices){
println(data)
}
}
}
fun forMonth4(dataList: List<String>) {
repeat(3){
for (data in dataList.indices){
println(data)
}
}
}*/
}
具體使用哪種循環(huán)方式,根據(jù)自身需求尋找即可,但是使用基礎for循環(huán)
時 AndroidStudio
會報警告,具體如下
根據(jù)提示 - 修改警告內(nèi)容后,你會發(fā)現(xiàn) for循環(huán)方式 都變?yōu)榱?進階for循環(huán) 中的常用方式了~
同時獲取index、數(shù)據(jù)
step過濾
多變量、多列表循環(huán) > <
文章來源:http://www.zghlxwxcb.cn/news/detail-795040.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-795040.html
到了這里,關于Kotlin基礎入門 - for、forEach 循環(huán)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!