写一篇好懂的常见Kotlin集合函数讲解(前)-灵析社区

德州安卓

map{}:实现集合中元素的类型转换

举个例子,现在有一个Model元素的集合:List<Model>

data class Model(val name: String = "", val id: Int = 0)

我们现在想从这个集合中获取到每个Model元素的id属性并组成一个新的集合,通常的做法如下:

fun map() {
    val list = mutableListOf(Model(id = 4), Model(id = 2), Model(id = 9))
    val result = mutableListOf<Int>()
    list.forEach {
        result.add(it.id)
    }
}

麻烦,现在有了map就可以这么写:val result2 = list.map { it.id }

当然也可以使用方法引用:val result2 = list.map(Model::id)

mapTo(){}:比map多了可以指定原始集合元素类型转换后写入的目标集合

之前的map调用了会返回一个新的集合类型,有时候我们想把这个新的集合添加到已有的集合中,比如:

fun mapTo(source: MutableList<Int>) {
    val list = mutableListOf(Model(id = 4), Model(id = 2), Model(id = 9))
    //将转换后的集合写入到source中
    source.addAll(list.map { it.id })
}

这样写起来也挺简单,但是我们还可以有更简单的写法:

//将转换后的集合写入到source中
list.mapTo(source) { it.id }

mapIndexed{}:支持带索引的元素类型转换

如果元素类型转换的时候还想知道该元素在集合中的索引,mapIndexed轻松搞定:

//index代表元素在集合中的索引
list.mapIndexed { index, model ->
}

filter{}:过滤符合指定条件的元素

开发中应该会经常遇到:从某个集合中筛选处符合特定条件的元素并重新组成一个新的集合,可能大家会立马写出下面代码:

fun filter() {
    val list = listOf(3, 4,  6, 5, 2)
    //从集合中筛选出不小于4的元素
    val result = mutableListOf<Int>()
    list.forEach { 
        if (it >= 4) {
            result.add(it)
        }
    }
}

这样写起来还是比较繁琐,直接使用filter函数实现:

val result2 = list.filter { it >= 4 }

该函数还有和map一样类似的函数:

  • filterIndexed{}:带下表索引的过滤函数
  • filterTo(){}: 类似于mapTo,可以将过滤后的元素写入到某个指定的集合中

indexOfFirst{}:正向查找集合中满足指定条件的元素的索引下标,不存在返回-1

val result4 = list.indexOfFirst { it.id == 5 }

该函数还有下面的类似函数:

  • indexOfLast{}: 反向查找集合中满足指定条件的元素的索引下标,不存在返回-1
  • indexOf():正向查找指定的元素在集合中的位置,不存在返回-1
  • lastIndexOf(): 反向查找指定的元素在集合中的位置,不存在返回-1

take(n):获取集合中前n个元素

当n大于等于集合的长度时,即代表获取整个集合元素;当n小于0,则会抛出异常;

还有其他类似的集合函数:

  • first()/first{}:获取集合第一个元素/符合指定条件的第一个元素
  • last()/last{}:获取集合最后一个元素/符合指定条件的最后一个元素
  • takeLast(n): 获取集合中最后的n个元素


阅读量:1884

点赞量:0

收藏量:0