You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:46:17