如何在kotlin中按块映射列表

Ada*_*dam 2 kotlin

我经常以这样的数据源结束(下面的伪代码,没有任何特定的语法,只是为了说明):

list = {
  "XLabel", 
  "XDescription", 
  "YLabel", 
  "YDescription", 
  "ZLabel", 
  "ZDescription"
}
Run Code Online (Sandbox Code Playgroud)

所需的输出是:

list = { 
  MyClass("XLabel", "XDescription"), 
  MyClass("YLabel", "YDescription"), 
  MyClass("ZLabel", "ZDescription")
}
Run Code Online (Sandbox Code Playgroud)

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

我基本上想要一个更强大的功能map,就像mapChunks( it1, it2 -> MyClass(it1, it2))分块是功能的一部分一样,这样它就会变得简单和漂亮。(我的示例将列表分成两个块,但 3 也是一个普遍的用例。)

有这个功能吗?或者最惯用的方法是什么?

mar*_*ran 6

您可以使用该chunked函数,然后map将结果覆盖。如果您解构 lambda 参数,语法将非常接近您想要的:

list.chunked(2)
    .map { (it1, it2) -> MyClass(it1, it2) }
    // Or use _it_ directly: .map { MyClass(it[0], it[1]) }
Run Code Online (Sandbox Code Playgroud)


Mat*_*aux 5

我认为该windowed方法应该做你想要的。

lst.windowed(size = 2, step = 2, partialWindows = false) { innerList -> MyClass(innerList[0], innerList[1]) }
Run Code Online (Sandbox Code Playgroud)

您也可以使用chunked,但它会windowed在幕后调用。但是通过分块,您可以获得比您预期的元素少的列表

编辑回答@android开发人员关于获取列表索引的问题

val lst = listOf(7, 8, 9, 10, 11, 12, 13, 14, 15, 16)
val windowedList = lst.mapIndexed { index, it -> index to it }
    .windowed(size = 2, step = 2, partialWindows = false) {
        it[0].first
    }
println(windowedList)
Run Code Online (Sandbox Code Playgroud)

会输出

[0, 2, 4, 6, 8]
Run Code Online (Sandbox Code Playgroud)