我经常以这样的数据源结束(下面的伪代码,没有任何特定的语法,只是为了说明):
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 也是一个普遍的用例。)
有这个功能吗?或者最惯用的方法是什么?
您可以使用该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)
我认为该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)
| 归档时间: |
|
| 查看次数: |
908 次 |
| 最近记录: |