【发布时间】:2018-07-02 10:31:51
【问题描述】:
试图理解 kotlin 中 map 和 mapTo 的区别。谁能帮我解释一下使用一些例子的区别
【问题讨论】:
-
来自文档:
mapTo:将给定的变换函数应用于原始数组的每个元素,并将结果附加到给定的目的地。另一方面map:返回一个列表,其中包含将给定变换函数应用于原始数组中的每个元素的结果。
试图理解 kotlin 中 map 和 mapTo 的区别。谁能帮我解释一下使用一些例子的区别
【问题讨论】:
mapTo:将给定的变换函数应用于原始数组的每个元素,并将结果附加到给定的目的地。另一方面map:返回一个列表,其中包含将给定变换函数应用于原始数组中的每个元素的结果。
map 在内部创建一个新列表,并将其结果放入该列表,然后返回该列表:
val mapResult = listOf(1, 2, 3).map { it * 2 } // you get a new list instance returned
如果您改用mapTo,则可以通过提供您自己的列表作为第一个参数来指定放置映射元素的目标:
val myList = ArrayList<Int>()
val mapToResult = listOf(1, 2, 3).mapTo(myList) { it * 2 }
如果您提供的列表中已经包含元素,则会保留这些元素,并将新的元素添加到这些元素中。为方便起见,它还返回目的地列表。
【讨论】:
地图:地图可以转换您的数据(列表),并可以返回完整的修改列表或模型变量的列表,例如:
你有一个模型:
data class Student(var id:String, var name:String, var className:String)
现在从 arrayOfStudent 中,我们想要所有学生的名字都用大写字母,所以像这样应用 map:
val listOfNamesInCapitalLetters= arrStudent.map {
it.name= it.name.toUpperCase()
}
Log.d("map_test", "student's name: $listOfNamesInCapitalLetters")
输出将是:
[AMIT, VIJAY, SUMIT, KARAN, SMAEER]
现在,如果你想要整个学生列表,名字用大写字母和 className 加 1,让我们这样做:
val result= arrStudent.map {
it.name= it.name.toUpperCase() // transforming name to upper case
it.className=it.className+1 // increasing class by 1
it // <- Note that we return it, because list will be prepared of the object which is returned by last statement of map
}
Log.d("modified_list", result.toString())
输出将是:
[Student(id=1, name=AMIT, className=6), Student(id=2, name=VIJAY, className=7), Student(id=3, name=KARAN, className=8), Student(id=4, name=VIRAT, className=9), Student(id=5, name=SAM, className=10)]
mapTo:如果要将列表转换为不同类型的列表,请使用 mapTo,例如,我们有一个不同的数据类,名为:CompactStudent
data class CompactStudent(val id:String, val name:String)
现在,如果我们想将 List 转换为 List,请注意 CompactStudent 包含 id 和 name,但与 Student 模型相比,className 不包含,所以要这样做:
val arrayList=ArrayList<CompactStudent>()
arrStudent.mapTo(arrayList){
CompactStudent(it.id,it.name)
}
Log.d("studentCompact", arrayList.toString())
输出将是:
[StudentCompct(id=1, name=AMIT), StudentCompct(id=2, name=VIJAY), StudentCompct(id=3, name=KARAN), StudentCompct(id=4, name=VIRAT), StudentCompct(id=5, name=SAM)]
【讨论】: