我目前有一些类似于以下机制的代码
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) {
// doing some transformation here in my original code,
// but for the sake of keeping it simple, just return `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>>
更加简洁和可读。
在stdlib中有没有一个函数可以实现这一点?
我知道associate
,但这不允许破坏产生的Pair,并且可能存在重复键的问题。
1条答案
按热度按时间zdwk9cvp1#
您正在寻找
unzip
-一种将List<Pair<T, U>>
转换为Pair<List<T>, List<U>>
的方法。您可以将最后的let
调用替换为unzip
。如果你将你所做的“转换”提取到另一个函数中,你就可以编写一些非常可读的东西,比如
it.takeIf { ... }?.run(::process)
。