代码之家  ›  专栏  ›  技术社区  ›  Jakub Mosakowski

将数组映射到对象列表kotlin

  •  3
  • Jakub Mosakowski  · 技术社区  · 6 年前

    我想知道如何将多个数组映射到一个对象列表中。

    我是说,我有

    val a = arrayOf("A1","A2","A3")
    val b = arrayOf("B1","B2","B3")
    

    data class SomeClass(val v1:String, val v2:String)
    

    我想用一种优雅的方式来解析它,得到这样的列表:

    val list = listOf(SomeClass("A1","B1"),SomeClass("A2","B2"),SomeClass("A3","B3"))
    

    我想它们的长度是一样的。我唯一想到的是:

    val list = mutableListOf<SomeClass>() 
    for (i in a.indices) 
                array.add(SomeClass(a[i],b[i])
    

    是否有更好、更优雅的解决方案(可能使用Collecions.zip或Array.map)?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Roland    6 年前

    尝试 Array.zip 然后 map :

    val list = a.zip(b)
                .map { SomeClass(it.first, it.second) }
    

    或者如果你更喜欢它:

    val list = a.zip(b)
                .map { (a, b) -> SomeClass(a, b) }
    

    请注意,如果两个数组的大小不同,则会忽略其他值。还要注意,这将创建中间 Pair s(它是 zip ). 尽管我喜欢直白的 地图 另外,@hotkeys关于重载方法的解决方案更合适(您可以忽略隐藏的 一对 -转换):

    val list = a.zip(b) { a, b -> SomeClass(a, b) }
    

    重载方法的亮点可能是在使用引用时:

    a.zip(b, ::SomeClass)
    

    只要有一个与压缩参数匹配的构造函数,而不是 一对 (还没有?).

        2
  •  2
  •   hotkey    6 年前

    改进 @Roland's answer ,您可以使用 zip 接受双参数函数以立即映射对的重载:

    val result = a.zip(b) { x, y -> SomeClass(x, y) }