Kotlin:如何映射到两个列表

时间:2019-04-11 01:08:28

标签: kotlin

在地图上,我们可以使用map通过使用

轻松进入列表
mapNumber.map{ it.key }

但是,如果我想同时列出两个列表,并且想避免两次map

val numbersInt = mapNumbers.map{ it.key }
val numbersStr = mapNumbers.map{ it.value }

所以我可以在下面写一些东西

fun main(args: Array<String>) {
    val mapNumbers = mapOf(Pair(1, "one"), Pair(2, "two"), Pair(3, "three"))

    val numbersInt = mutableListOf<Int>()
    val numbersStr = mutableListOf<String>()

    for ((key, value) in mapNumbers) {
        numbersInt.add(key)
        numbersStr.add(value)
    }

    print(numbersInt)
    print(numbersStr)   
}

但这不好,因为我必须使用mutableListOf。我想知道是否有任何收集功能可以帮助我们实现这一目标?

2 个答案:

答案 0 :(得分:3)

我建议使用unzip()标准库函数。

fun main(args: Array<String>) {
    val mapNumbers = mapOf(Pair(1, "one"), Pair(2, "two"), Pair(3, "three"))

    val (numbersInt, numbersStr) = mapNumbers.toList().unzip()

    print(numbersInt)
    print(numbersStr)
}

在这里,我已经将map转换为Pair对象的列表。然后调用unzip()方法。使用解构声明,我将unzip()返回的值分配给了这些变量。 请参阅:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/unzip.html。 希望您会喜欢这种解决方案。

答案 1 :(得分:1)

我不确定您为什么不赞成dyukha的评论,您可以将返回的集合保存在您喜欢的任何命名变量中。当然,这是两行代码,但是我认为它仍然非常有效,可以准确表达您想要的内容。

   fun main(args: Array<String>) {
        val mapNumbers = mapOf(Pair(1, "one"), Pair(2, "two"), Pair(3, "three"))

        val numbersInt = mapNumbers.keys
        val numbersStr = mapNumbers.values

        print(numbersInt)
        print(numbersStr)   
    }