代码之家  ›  专栏  ›  技术社区  ›  Adam

如何在Kotlin中按块映射列表

  •  1
  • Adam  · 技术社区  · 6 年前

    我经常以数据源结尾,比如(下面的伪代码,不是任何特定的语法,它只是为了说明):

    list = {
      "XLabel", 
      "XDescription", 
      "YLabel", 
      "YDescription", 
      "ZLabel", 
      "ZDescription"
    }
    

    所需输出为:

    list = { 
      MyClass("XLabel", "XDescription"), 
      MyClass("YLabel", "YDescription"), 
      MyClass("ZLabel", "ZDescription")
    }
    

    有什么比做一个更干净的吗? fold() 把它折叠成一个新的列表?我也拒绝做一些奇怪的事情 list.partition().zip()

    我基本上想要一个更强大的 map 那就行了 mapChunks( it1, it2 -> MyClass(it1, it2)) 其中分块是函数的一部分,因此它变得简单而漂亮。(我的示例将列表分为两块,但3也是一个常见的用例。)

    此功能是否存在?或者最惯用的方法是什么?

    4 回复  |  直到 6 年前
        1
  •  4
  •   marstran    6 年前

    你可以使用 chunked 函数,然后 map 在结果上。如果您破坏lambda参数,语法将非常接近您想要的:

    list.chunked(2)
        .map { (it1, it2) -> MyClass(it1, it2) }
        // Or use _it_ directly: .map { MyClass(it[0], it[1]) }
    
        2
  •  0
  •   Matt Berteaux    6 年前

    我认为 windowed 方法应该执行您想要的操作。

    lst.windowed(size = 2, partialWindows = false) { innerList -> MyClass(innerList[0], innerList[1]) }
    

    您也可以使用 chunked 但它召唤 加窗的 在引擎盖下面。但是使用chunked,可以得到元素比预期少的列表。

        3
  •  0
  •   Sergio    6 年前

    您可以创建一个 扩展函数 ,例如 mapChunks 并重用它:

    fun List<String>.mapChunks(): List<MyClass> {
        return chunked(2).map { MyClass(it[0], it[1]) }
    }
    
    val list1 = listOf(
        "XLabel",
        "XDescription",
        "YLabel",
        "YDescription",
        "ZLabel",
        "ZDescription"
    )
    val result1 = list1.mapChunks()
    
    val list2 = listOf(
            "XLabel1",
            "XDescription1",
            "YLabel1",
            "YDescription1",
            "ZLabel1",
            "ZDescription1"
    )
    val result2 = list2.mapChunks()
    
        4
  •  0
  •   Ash    6 年前

    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html

    chunked返回指定大小的子列表

    这是您想要的API调用

    考虑到你的清单是2对的,你可以这样做。

    list.chunked(2)  //List<List<String>>
        .map{MyClass(it[0], it[1]} //list<MyClass>