我有一个例子来说明我的意思:
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) } ...
有办法吗?
答案 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