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

Kotlin 如何将元组列表转换为列表元组?,kotlin,functional-programming,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 } 我有一些返

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

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) } ...

有办法吗?

如果你真的想这样解构它,我也会拆分你的
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
-语句中显示的内容。

似乎kotlin
解压
函数正是您想要的。

在您的示例中,用法如下所示

val (leftRange, rightRange) = pairs.unzip()

我认为这是不可能的,因为map创建一个流而不是两个流。但我感兴趣的是,如果有人找到了一种方法:-)