Kotlin中map和mapTo有什么区别

时间:2018-07-02 10:31:52

标签: android kotlin

试图了解kotlin中map和mapTo之间的区别。有人可以通过一些例子帮我解释一下差异吗?

2 个答案:

答案 0 :(得分:4)

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 }

如果您提供的列表中已经包含元素,则将保留这些元素,并将新元素添加到其中。为了方便起见,它还会返回目标列表。

答案 1 :(得分:0)

地图:地图可以转换您的数据(列表),并且可以返回完整的修改列表或模型变量列表,例如:

您有一个模型:

data class Student(var id:String, var name:String, var className:String)

现在,从arrayOfStudent开始,我们希望所有学生的姓名都使用大写字母,因此请像这样应用地图:

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包含nameclassName但不包含Student,为此:

 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)]