Kotlin中如何基于多列表元素按索引匹配批量生成数据类实例
Kotlin 按规则组合多列表生成目标实例列表
预设代码
当前定义的列表与数据类如下:
val qrtr = listOf("Q1", "Q2", "Q3", "Q4") data class X(val name: String, val location: String) val x1 = X("John Doe", "USA") val x2 = X("Jane Doe", "Singapore") val allX = listOf(x1, x2) data class Y(val title: String, val rating: Double) val y1 = Y("Senior", 4.8) val y2 = Y("Junior", 4.5) val allY = listOf(y1, y2) data class Z(val x: X, val y: Y, val quarter: String)
小提示:原定义的Z类中quarter参数前漏了val修饰,不加该修饰符的话quarter仅作为构造参数存在,不会成为类的成员属性,外部无法直接访问。
需求逻辑
需要实现的规则拆解为两步:
- 将
allX和allY的元素按下标一一配对 - 每一组配对的(x,y)元素,分别和
qrtr中的每一个季度值组合,生成对应的Z实例,最终汇总为一维列表
等价的手动实现效果:
val z1 = Z(x1, y1, "Q1") val z2 = Z(x1, y1, "Q2") val z3 = Z(x1, y1, "Q3") val z4 = Z(x1, y1, "Q4") val z5 = Z(x2, y2, "Q1") val z6 = Z(x2, y2, "Q2") val z7 = Z(x2, y2, "Q3") val z8 = Z(x2, y2, "Q4") val allZ = listOf(z1, z2, z3, z4, z5, z6, z7, z8)
简便实现方案
直接使用Kotlin标准库的集合操作函数即可完成,无需额外依赖:
方案1:使用zip配对
zip是Kotlin标准库提供的同索引配对函数,默认以两个列表中更短的长度为准配对,不会出现索引越界,配对后通过展平操作生成所有Z实例:
val allZ = allX.zip(allY) { x, y -> qrtr.map { quarter -> Z(x, y, quarter) } }.flatten()
方案2:按索引遍历
如果明确知道allX和allY长度一致,也可以直接按下标遍历,逻辑更直观:
val allZ = allX.indices.flatMap { idx -> qrtr.map { q -> Z(allX[idx], allY[idx], q) } }
两种方案运行结果和手动编写的代码完全一致。
内容的提问来源于stack exchange,提问作者Manu Manjunath
相关产品推荐
相关产品推荐

