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

时间:2018-03-27 16:51:18

标签: kotlin

Pair转换为List是一种惯用方法:

Pair(a, b).toList()

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

Pair(list[0], list[1])

我的问题是我需要先在代码中设置一个List值才能使其生效。我会喜欢这样的事情:

listOf(a, b).toPair()

4 个答案:

答案 0 :(得分:7)

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

  

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

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

    <?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="SitePhysicalPath" value="E:\Program Files (x86)\Acumatica ERP\960 Instances\AcumaticaIntegrations"/>
    <add key="GenResultPath" value="C:\SDK\ClassGenerator\Out"/>
    <add key="Username" value="admin@Company"/>
    <add key="Namespace" value="GeneratedWrappers.Acumatica"/>
    <add key="ClearOutput" value="true"/>
    <add key="FilenameFilter" value="CS100000, CS102000, CM202000, GL201500, CS202000, GL202500, GL102000, GL101000, GL201000"/>
    <!--<add key="PagesList" value="list.txt"/>
    <add key="PagesListAttribute" value="exclude"/>
    <add key="PagesListAttribute" value="include"/>
    <add key="PagesParameters" value="ParamsPP.txt"/>
    <add key="GenericInquiryParameters" value="ParamsGI.txt"/>-->
  </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
  </startup>
</configuration>

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

答案 1 :(得分:4)

您可以为自己制作此扩展程序:

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])
}

错误处理取决于您,在Pair<T, T>?长度不正确的情况下,您还可以返回null并返回List。你也可以只检查它至少有2个元素,而不是要求它只有2个。

用法如您所述:

listOf(a, b).toPair()

答案 2 :(得分:0)

感谢stan0found my idiomatic way

在这个具体的例子中,它将是:

listOf(a, b).zipWithNext().first()

答案 3 :(得分:0)

这是@ zsmb13解决方案的一种变体,它避免显式创建异常并按索引取消引用列表:

fun <T> List<T>.toPair(): Pair<T, T> {
    require (this.size == 2) { "List is not of length 2!" }
    val (a, b) = this
    return Pair(a, b)
}