前言
上节我们讲了集合Map相关知识,大家感兴趣的可参看以下文章
[1]Kotlin中的算数运算
[2]二元运算符 ?:
[3]Any的使用
[4]数组Array
[5]Predicate的使用
[6]字符串String
[7]集合List
[8]集合Set及优化类DataUtil,ArrayUtil
[9]集合List优化
[10]集合Map
在日常开发过程中,无论是数组还是集合我们经常使用到遍历,那么今天就让我们来学习一下遍历相关的知识吧。
今天涉及到的知识有:
1.通用遍历方式
2.封装遍历类IteratorUtil中方法介绍
3.IteratorUtil在Activity中使用
4.IteratorUtil源码
一. 通用遍历方式
遍历的通用方式有for循环,while循环,以及迭代器iterator。
一般它们的遍历方式如下:
var array = arrayOf("a", "b")
LogUtil.i("===========数组遍历==========")
LogUtil.i("iterator遍历数组:")
var iterator: Iterator<String> = array.iterator()
while (iterator.hasNext()) {
var it = iterator.next()
LogUtil.i("it=${it}")
// iterator.remove()
}
LogUtil.i("")
LogUtil.i("while遍历数组:")
var index = 0
while (index < array.size) {
var it = array[index]
LogUtil.i("it=${it}")
index++
}
LogUtil.i("")
LogUtil.i("for-i遍历数组:")
for (i in 0 until array.count()) {
var it = array[i]
LogUtil.i("i=$i it=$it")
}
LogUtil.i("")
LogUtil.i("forIndices遍历数组:")
for (i in array.indices) {
var it = array[i]
LogUtil.i("i=$i it=$it")
}
LogUtil.i("")
LogUtil.i("forEach遍历数组:")
array.forEach {
LogUtil.i("it=${it}")
}
LogUtil.i("")
LogUtil.i("forEachIndex遍历数组:")
array.forEachIndexed { i, it ->
LogUtil.i("i=$i it=$it")
}
LogUtil.i("")
LogUtil.i("===========map遍历==========")
var map: MutableMap<String, Int> = mutableMapOf(
"a" to 1,
"b" to 2
)
LogUtil.i("MutableEntry遍历map:")
for (it in map.entries) {
LogUtil.i("it.key=${it.key} it.value=${it.value}")
}
LogUtil.i("")
LogUtil.i("遍历map的key:")
for (it in map.keys) {
LogUtil.i("it.key=${it} it.value=${map[it]}")
}
LogUtil.i("")
LogUtil.i("遍历map的value:")
for (it in map.values) {
LogUtil.i("it.value=${it}")
}
输出结果如下:
17:42:52.733 I ========一般遍历========
17:42:52.733 I ===========数组遍历==========
17:42:52.733 I iterator遍历数组:
17:42:52.733 I it=a
17:42:52.733 I it=b
17:42:52.733 I
17:42:52.733 I while遍历数组:
17:42:52.733 I it=a
17:42:52.733 I it=b
17:42:52.733 I
17:42:52.733 I for-i遍历数组:
17:42:52.733 I i=0 it=a
17:42:52.734 I i=1 it=b
17:42:52.734 I
17:42:52.734 I forIndices遍历数组:
17:42:52.734 I i=0 it=a
17:42:52.734 I i=1 it=b
17:42:52.734 I
17:42:52.734 I forEach遍历数组:
17:42:52.734 I it=a
17:42:52.734 I it=b
17:42:52.734 I
17:42:52.734 I forEachIndex遍历数组:
17:42:52.734 I i=0 it=a
17:42:52.734 I i=1 it=b
17:42:52.734 I
17:42:52.735 I ===========map遍历==========
17:42:52.735 I MutableEntry遍历map:
17:42:52.736 I it.key=a it.value=1
17:42:52.736 I it.key=b it.value=2
17:42:52.737 I
17:42:52.737 I 遍历map的key:
17:42:52.737 I it.key=a it.value=1
17:42:52.737 I it.key=b it.value=2
17:42:52.737 I
17:42:52.737 I 遍历map的value:
17:42:52.738 I it.value=1
17:42:52.738 I it.value=2
二. 封装遍历类 IteratorUtil 中方法介绍
为了使用方便,这里我将遍历方法封装到一个工具类IteratorUtil中,其有以下方法:
/***
* Collection,map,数组迭代器遍历
*
* @param t T
* @param isReversed Boolean 是否倒序遍历,默认false。(map无序,不受此参数影响)
* @param loop Function1<E, Unit>
*/
fun <T, E> iterator(t: T, loop: (E) -> Unit, isReversed: Boolean = false)
/***
* Collection,map,数组forEach遍历
*
* @param t T
* @param loop Function1<E, Unit>
*/
fun <T, E> forEach(t: T, loop: (E) -> Unit)
/***
* Collection,数组forEachIndexed遍历
*
* @param t T
* @param loop Function2<Int, E, Unit>
*/
fun <T, E> forEachIndexed(t: T, loop: (Int, E) -> Unit)
三. IteratorUtil 在 Activity 中使用
接下来让我们看看IteratorUtil在Activity中的使用:
package com.example.kdemo.ui.test
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import com.example.kdemo.R
import com.example.kdemo.databinding.ActivityTestBinding
import com.example.kdemo.util.data.collection.IteratorUtil
import com.example.kdemo.util.log.LogUtil
import com.example.kdemo.util.toast.ToastUtil
class TestActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var mBinding: ActivityTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityTestBinding.inflate(layoutInflater)
setContentView(mBinding.root)
initData()
setListener()
}
private fun initData() {}
private fun setListener() {
mBinding.mBtnTest.setOnClickListener(this)
}
@RequiresApi(Build.VERSION_CODES.Q)
override fun onClick(view: View) {
when (view.id) {
R.id.mBtnTest -> {
test()
}
else -> {
}
}
}
private fun test() {
ToastUtil.showShortToast(this, "begin test")
//list遍历示例
LogUtil.i("=========list遍历示例:")
var list = listOf("a", "b", "c")
//迭代器遍历
IteratorUtil.iterator<Collection<String>,String>(list, {
LogUtil.i("迭代器遍历: list_item=$it")
})
//迭代器遍历倒序遍历
IteratorUtil.iterator<Collection<String>,String>(list, {
LogUtil.i("迭代器倒序遍历: list_item=$it")
},true)
//forEach遍历
IteratorUtil.forEach<Collection<String>,String>(list,{
LogUtil.i("forEach遍历: list_item=$it")
})
//forEachIndexed遍历
IteratorUtil.forEachIndexed<Collection<String>, String>(list, { index, it ->
LogUtil.i("forEachIndexed: list_index=$index list_item=$it")
})
//set遍历示例
LogUtil.i("")
LogUtil.i("=========set遍历示例:")
var set = setOf(1, 2, 3)
//迭代器遍历
IteratorUtil.iterator<Collection<Int>,Int>(set, {
LogUtil.i("迭代器遍历: set_item=$it")
})
//迭代器遍历倒序遍历(set倒序遍历无意义,因为set无序)
IteratorUtil.iterator<Collection<Int>,Int>(set, {
LogUtil.i("迭代器倒序遍历(set倒序遍历无意义,因为set无序): set_item=$it")
},true)
//forEach遍历
IteratorUtil.forEach<Collection<Int>,Int>(set,{
LogUtil.i("forEach遍历: set_item=$it")
})
//forEachIndexed遍历
IteratorUtil.forEachIndexed<Collection<Int>,Int>(set,{ index, it ->
LogUtil.i("forEachIndexed遍历: [set无序,下标没啥用]set_index=$index set_item=$it")
})
//map遍历示例
LogUtil.i("")
LogUtil.i("=========map遍历示例:")
var map = mapOf("a" to 1,"b" to 2)
//迭代器遍历
IteratorUtil.iterator<Map<String,Int>,Map.Entry<String,Int>>(map, {
LogUtil.i("迭代器遍历: map_key=${it.key} map_value=${it.value}")
})
//map无序,无倒序遍历
//forEach遍历
IteratorUtil.forEach<Map<String,Int>,Map.Entry<String,Int>>(map,{
LogUtil.i("forEach遍历: map_key=${it.key} map_value=${it.value}")
})
//forEachIndexed遍历
//注:Map无序,因此无下标,不能用forEachIndexed遍历
//数组Array遍历示例
LogUtil.i("")
LogUtil.i("=========数组Array遍历示例:")
var arrays = arrayOf(true, false,null)
//迭代器遍历
IteratorUtil.iterator<Array<Boolean?>, Boolean?>(arrays, {
LogUtil.i("迭代器遍历: arrays_item=${it}")
})
//迭代器倒序遍历
IteratorUtil.iterator<Array<Boolean?>,Boolean?>(arrays, {
LogUtil.i("迭代器倒序遍历: arrays_item=${it}")
},true)
//forEach遍历
IteratorUtil.forEach<Array<Boolean?>,Boolean?>(arrays,{
LogUtil.i("forEach遍历: arrays_item=${it}")
})
//forEachIndexed遍历
IteratorUtil.forEachIndexed<Array<Boolean?>,Boolean?>(arrays,{ index, it ->
LogUtil.i("forEachIndexed遍历: arrays_indx=$index arrays_item=${it}")
})
LogUtil.i("")
LogUtil.i("")
LogUtil.i("========一般遍历========")
normalForEach()
}
private fun normalForEach() {
var array = arrayOf("a", "b")
LogUtil.i("===========数组遍历==========")
LogUtil.i("iterator遍历数组:")
var iterator: Iterator<String> = array.iterator()
while (iterator.hasNext()) {
var it = iterator.next()
LogUtil.i("it=${it}")
// iterator.remove()
}
LogUtil.i("")
LogUtil.i("while遍历数组:")
var index = 0
while (index < array.size) {
var it = array[index]
LogUtil.i("it=${it}")
index++
}
LogUtil.i("")
LogUtil.i("for-i遍历数组:")
for (i in 0 until array.count()) {
var it = array[i]
LogUtil.i("i=$i it=$it")
}
LogUtil.i("")
LogUtil.i("forIndices遍历数组:")
for (i in array.indices) {
var it = array[i]
LogUtil.i("i=$i it=$it")
}
LogUtil.i("")
LogUtil.i("forEach遍历数组:")
array.forEach {
LogUtil.i("it=${it}")
}
LogUtil.i("")
LogUtil.i("forEachIndex遍历数组:")
array.forEachIndexed { i, it ->
LogUtil.i("i=$i it=$it")
}
LogUtil.i("")
LogUtil.i("===========map遍历==========")
var map: MutableMap<String, Int> = mutableMapOf(
"a" to 1,
"b" to 2
)
LogUtil.i("MutableEntry遍历map:")
for (it in map.entries) {
LogUtil.i("it.key=${it.key} it.value=${it.value}")
}
LogUtil.i("")
LogUtil.i("遍历map的key:")
for (it in map.keys) {
LogUtil.i("it.key=${it} it.value=${map[it]}")
}
LogUtil.i("")
LogUtil.i("遍历map的value:")
for (it in map.values) {
LogUtil.i("it.value=${it}")
}
}
}
运行结果如下:
17:42:52.634 I =========list遍历示例:
17:42:52.637 I 迭代器遍历: list_item=a
17:42:52.637 I 迭代器遍历: list_item=b
17:42:52.637 I 迭代器遍历: list_item=c
17:42:52.649 I 迭代器倒序遍历: list_item=c
17:42:52.649 I 迭代器倒序遍历: list_item=b
17:42:52.649 I 迭代器倒序遍历: list_item=a
17:42:52.650 I forEach遍历: list_item=a
17:42:52.650 I forEach遍历: list_item=b
17:42:52.650 I forEach遍历: list_item=c
17:42:52.651 I forEachIndexed: list_index=0 list_item=a
17:42:52.651 I forEachIndexed: list_index=1 list_item=b
17:42:52.651 I forEachIndexed: list_index=2 list_item=c
17:42:52.651 I
17:42:52.651 I =========set遍历示例:
17:42:52.723 I 迭代器遍历: set_item=1
17:42:52.723 I 迭代器遍历: set_item=2
17:42:52.723 I 迭代器遍历: set_item=3
17:42:52.723 I 迭代器倒序遍历(set倒序遍历无意义,因为set无序): set_item=3
17:42:52.724 I 迭代器倒序遍历(set倒序遍历无意义,因为set无序): set_item=2
17:42:52.724 I 迭代器倒序遍历(set倒序遍历无意义,因为set无序): set_item=1
17:42:52.725 I forEach遍历: set_item=1
17:42:52.725 I forEach遍历: set_item=2
17:42:52.725 I forEach遍历: set_item=3
17:42:52.726 I forEachIndexed遍历: [set无序,下标没啥用]set_index=0 set_item=1
17:42:52.726 I forEachIndexed遍历: [set无序,下标没啥用]set_index=1 set_item=2
17:42:52.726 I forEachIndexed遍历: [set无序,下标没啥用]set_index=2 set_item=3
17:42:52.726 I
17:42:52.726 I =========map遍历示例:
17:42:52.727 I 迭代器遍历: map_key=a map_value=1
17:42:52.727 I 迭代器遍历: map_key=b map_value=2
17:42:52.727 I forEach遍历: map_key=a map_value=1
17:42:52.727 I forEach遍历: map_key=b map_value=2
17:42:52.727 I
17:42:52.727 I =========数组Array遍历示例:
17:42:52.730 I 迭代器遍历: arrays_item=true
17:42:52.731 I 迭代器遍历: arrays_item=false
17:42:52.731 I 迭代器遍历: arrays_item=null
17:42:52.731 I 迭代器倒序遍历: arrays_item=null
17:42:52.731 I 迭代器倒序遍历: arrays_item=false
17:42:52.731 I 迭代器倒序遍历: arrays_item=true
17:42:52.732 I forEach遍历: arrays_item=true
17:42:52.732 I forEach遍历: arrays_item=false
17:42:52.732 I forEach遍历: arrays_item=null
17:42:52.732 I forEachIndexed遍历: arrays_indx=0 arrays_item=true
17:42:52.732 I forEachIndexed遍历: arrays_indx=1 arrays_item=false
17:42:52.732 I forEachIndexed遍历: arrays_indx=2 arrays_item=null
17:42:52.733 I
17:42:52.733 I
17:42:52.733 I ========一般遍历========
17:42:52.733 I ===========数组遍历==========
17:42:52.733 I iterator遍历数组:
17:42:52.733 I it=a
17:42:52.733 I it=b
17:42:52.733 I
17:42:52.733 I while遍历数组:
17:42:52.733 I it=a
17:42:52.733 I it=b
17:42:52.733 I
17:42:52.733 I for-i遍历数组:
17:42:52.733 I i=0 it=a
17:42:52.734 I i=1 it=b
17:42:52.734 I
17:42:52.734 I forIndices遍历数组:
17:42:52.734 I i=0 it=a
17:42:52.734 I i=1 it=b
17:42:52.734 I
17:42:52.734 I forEach遍历数组:
17:42:52.734 I it=a
17:42:52.734 I it=b
17:42:52.734 I
17:42:52.734 I forEachIndex遍历数组:
17:42:52.734 I i=0 it=a
17:42:52.734 I i=1 it=b
17:42:52.734 I
17:42:52.735 I ===========map遍历==========
17:42:52.735 I MutableEntry遍历map:
17:42:52.736 I it.key=a it.value=1
17:42:52.736 I it.key=b it.value=2
17:42:52.737 I
17:42:52.737 I 遍历map的key:
17:42:52.737 I it.key=a it.value=1
17:42:52.737 I it.key=b it.value=2
17:42:52.737 I
17:42:52.737 I 遍历map的value:
17:42:52.738 I it.value=1
17:42:52.738 I it.value=2
四. IteratorUtil 源码
接下来给出IteratorUtil源码:








网友评论