在Kotlin中将List转换为Pair的惯用方法

cre*_*not 5 kotlin

有一种惯用的方法将a Pair转换为List:

Pair(a, b).toList()
Run Code Online (Sandbox Code Playgroud)

不,我正在寻找相反的过程.我最好的方法是这样的:

Pair(list[0], list[1])
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要先List在代码中创建一个值才能使其正常工作.我会喜欢这样的事情:

listOf(a, b).toPair()
Run Code Online (Sandbox Code Playgroud)

sta*_*an0 9

对于更通用的解决方案,您可以使用扩展功能zipWithNext*

返回此集合中每两个相邻元素的对的列表.

文档中的示例更好地解释了它:

val letters = ('a'..'f').toList()
val pairs = letters.zipWithNext()

println(letters) // [a, b, c, d, e, f]
println(pairs) // [(a, b), (b, c), (c, d), (d, e), (e, f)]
Run Code Online (Sandbox Code Playgroud)

*请注意,此功能自Kotlin v1.2起可用.

  • 只需在“zipWithNext()”调用中附加一个“.single()”即可,解决方案将是完美的。 (2认同)

zsm*_*b13 6

你可以为自己做这个扩展:

fun <T> List<T>.toPair(): Pair<T, T> {
    if (this.size != 2) {
        throw IllegalArgumentException("List is not of length 2!")
    }
    return Pair(this[0], this[1])
}
Run Code Online (Sandbox Code Playgroud)

错误处理由您决定,您也可以返回 aPair<T, T>?nullList长度不正确的情况下返回。您也可以只检查它是否至少有 2 个元素,而不要求它正好有 2 个。

用法如您所述:

listOf(a, b).toPair()
Run Code Online (Sandbox Code Playgroud)

  • 创建封装一些逻辑的扩展是非常惯用的。 (2认同)
  • 我不明白这不能直接解决你的问题。它不在标准库中,因为它是一个非常具体的任务,并且不能像“zipWithNext”一样普遍使用。然而,它确实提供了您正在寻找的精确语法和结果,而“zipWithNext”实际上两者都没有。 (2认同)