如何将元组列表转换为列表元组?

时间:2018-11-19 07:30:42

标签: kotlin functional-programming

我有一个例子来说明我的意思:

fun makeRange(i: Int) = Pair(i - 1, i + 1)
val listOfData = listOf(1, 2, 3, 4, 5, 6)

val pairs = listOfData
                .map { makeRange(it) }
val leftRange = pairs.map { it.first }
val rightRange = pairs.map { it.second }

我有一些返回元组的列表和函数。但是我需要的结果是两个列表加倍。我需要这样的东西:

    // can I get something like that ?
    val (leftRange, rightRange) = listOfData.map { makeRange(it) } ...

有办法吗?

2 个答案:

答案 0 :(得分:1)

如果您真的想对它进行解构,我也将拆分您的makeRange函数,例如:

fun makeLeftRange(i: Int) = i - 1
fun makeRightRange(i: Int) = i + 1
fun makeRange(i: Int) = makeLeftRange(i) to makeRightRange(i) // if you still need it...

然后您可以按以下步骤进行销毁:

val (leftRange, rightRange) = listOfData.map(::makeLeftRange) to listOfData.map(::makeRightRange)

或者如果它真的只是这么简单的功能,为什么不直接使用以下内容呢?

val (leftRange, rightRange) = listOfData.map(Int::dec) to listOfData.map(Int::inc)
// or
val (leftRange, rightRange) = listOfData.map { it - 1 } to listOfData.map { it + 1 }

如果您想保持makeRange不变并且想要那样操作,它将变得更加难看,例如:

val (leftRange, rightRange) = listOfData.map(::makeRange).let { 
  listOfPairs -> listOfPairs.map { it.first } to listOfPairs.map { it.second }
}

基本上重复使用您在其他let语句中显示的内容。

答案 1 :(得分:0)

似乎 kotlin nodemon 函数正是您要找的。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/unzip.html

在您的示例中,用法看起来像

unzip