首页 > 解决方案 > 如何将元组列表转换为列表元组?

问题描述

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

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

有没有办法做到这一点?

标签: kotlinfunctional-programming

解决方案


如果你真的想像这样解构它,我也会拆分你的makeRange-function,例如:

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语句中显示的内容。


推荐阅读