Kotlin标准库是否有函数可将List<Pair<A,B>>转为Pair<List<A>,List<B>>
Kotlin标准库中是否有将
List<Pair<A,B>>转换为Pair<List<A>,List<B>>的函数? 原始代码
fun main() { val listOfLists = listOf(listOf("1234", "1", "42"), listOf("hello", "there")) val (lengths: List<List<Int>>, resultingListsOfLists: List<List<String>?>) = listOfLists .map { val lengths = it.map { it.count() } Pair( lengths, if (lengths.sum() > 5) { // 原代码中这里会做一些转换,为简化示例直接返回`it` it } else { null } ) } .let { mapped -> println(mapped) Pair(mapped.map { it.first }, mapped.map { it.second }) } println(lengths) println(resultingListsOfLists) }
预期输出
[([4, 1, 2], [1234, 1, 42]), ([5, 5], [hello, there])] [[4, 1, 2], [5, 5]] [[1234, 1, 42], [hello, there]]
问题描述
这段代码能满足需求,但最后的let部分略显冗长。想知道Kotlin标准库中是否有更简洁的方式实现将List<Pair<A,B>>转换为Pair<List<A>,List<B>>的操作。已知associate函数不适用,因为它无法解构生成的Pair,还可能存在重复键的问题。
解答
Kotlin标准库中的unzip()函数正好能完成这个操作,它可以直接将List<Pair<A, B>>拆分为Pair<List<A>, List<B>>,完全替代手写的let逻辑。
修改后的代码
fun main() { val listOfLists = listOf(listOf("1234", "1", "42"), listOf("hello", "there")) val (lengths: List<List<Int>>, resultingListsOfLists: List<List<String>?>) = listOfLists .map { val lengths = it.map { it.count() } Pair( lengths, if (lengths.sum() > 5) { // 原代码中这里会做一些转换,为简化示例直接返回`it` it } else { null } ) } .also { println(it) } // 保留原有的打印逻辑 .unzip() println(lengths) println(resultingListsOfLists) }
说明
unzip()函数会遍历列表中的每一个Pair,将所有first元素收集为一个列表,所有second元素收集为另一个列表,最终返回包含这两个列表的Pair。- 原代码中
let里的打印逻辑可以用also替代,因为also会返回原对象,不影响后续调用unzip()。
内容的提问来源于stack exchange,提问作者greyhairredbear
相关产品推荐
相关产品推荐

