kotlin - 如何将元组列表转换为列表元组?
问题描述
我有一个例子来说明我的意思:
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
-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
语句中显示的内容。
推荐阅读
- git - git rebase 的 --preserve-merges 不够强大
- reactjs - 有没有办法合并应用程序端口和下一个 js 端口?
- javascript - 如何为 d3.js 图表添加过渡效果
- azure-powershell - PowerShell 7. ForEach-Object -Parallel 不针对 Azure PowerShell 进行身份验证
- xamarin.forms - 有没有办法使用 Xamarin 在蓝牙 LE 数据包中设置命令标志?
- html - 致命错误:非抽象方法 NF_Handlers_FieldsetRepeater::isFieldsetData() 必须包含正文
- flutter - Flutter 如何制作始终位于每一页顶部的底页
- c# - 更改源后 WPF 图像显示未更新
- express - 如何在 Sequelize 中使用 onDelete Cascade
- javascript - 使 FormikInput 在多行中显示其值