🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### map函数 **集合中的map函数是最常用的一种函数式API,它用于将集合中的每个元素都映射成一个另外的值,映射的规则在Lambda表达式中指定,最终生成一个新的集合**。比如,这里我们希望让所有的水果名都变成大写模式,就可以这样写: ~~~ fun main() { val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon") val newList = list.map { it.toUpperCase() } for (fruit in newList) { println(fruit) } } ~~~ 可以看到,我们在map函数的Lambda表示式中指定将单词转换成了大写模式,然后遍历这个新生成的集合。运行一下代码,结果如图2.26所示。 ![图像说明文字](http://epub.ituring.com.cn/api/storage/getbykey/screenshow?key=2003f6a3593e468924f0) **map函数的功能非常强大,它可以按照我们的需求对集合中的元素进行任意的映射转换**,上面只是一个简单的示例而已。除此之外,你还可以将水果名全部转换成小写,或者是只取单词的首字母,甚至是转换成单词长度这样一个数字集合,只要在Lambda表示式中编写你需要的逻辑即可。 另一个示例: 如果你想打印的只是一个姓名列表,而不是人的完整信息列表,可以用map来变换列表: ``` data class Person(val name: String, val age: Int) fun main(args: Array<String>) { val people = listOf(Person("Alice", 29), Person("Bob", 31)) println(people.map { it.name }) } ``` 注意:这里可以使用成员引用 ``` people. map(Person:name) ``` 可以轻松地把多次这样的调用链接起来。例如,打印出年龄超过30 岁的人的名字: ``` people.filter { it .age > 30 }.map(Person::name)//Bob ``` #### map的源码 ~~~ public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform) } ~~~ ~~~ public inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapTo(destination: C, transform: (T) -> R): C { for (item in this) destination.add(transform(item)) return destination } ~~~ 在上面的代码中,首先定义了map扩展方法,它的实现主要是依赖mapTo方法。**mapTo方法接收两个参数,第1个参数类型是集合(MutableCollection),第2个参数为一个方法(transform: (T) -> R)),最终返回一个集合。在mapTo方法内部的实现其实很简单,就是将transform方法产生的结果添加到一个新集合里面去,最终返回这个新的集合**。 通过使用map方法,我们就免去了for语句,而且也不用再去定义一些中间变量了。在Kotlin中,类似map的方法还有许多,它们在处理集合的时候也都非常实用