Kotlin中如何实现列表重复拼接,达成Python列表乘3的等价效果
Kotlin 实现列表内容连续重复拼接为新列表的常用方案
前置场景:已定义整型可变列表
val a: MutableList<Int> = mutableListOf(1,2,3,4),需要生成全新列表b,元素序列为[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],等价于Python中a * 3的原生语法效果。
注:实际Kotlin代码初始化列表需通过构造函数完成,不能直接用括号对列表类型赋值。
最简洁的标准库实现(Kotlin 1.4+ 可用)
直接调用官方集合扩展方法repeat(n),一行代码即可达成目标:// 生成不可变类型的全新列表 val b = a.repeat(3) // 如需可变类型结果,可直接做类型转换 val mutableB = a.repeat(3).toMutableList()该方法由Kotlin集合标准库提供,逻辑为将原集合的元素连续重复n次后组装为全新列表,全程不会修改原列表的内容,完全匹配需求。
低版本兼容的循环拼接实现
如果项目Kotlin版本较低,无法使用repeat集合扩展,可通过循环追加元素的方式实现,性能和标准库实现无差异:// 兼容所有Kotlin版本的写法 val b = mutableListOf<Int>().apply { repeat(3) { addAll(a) // 每次循环将原列表的全部元素追加到新列表末尾 } } // Kotlin 1.3.7+ 可用更简洁的buildList写法 val b = buildList { repeat(3) { addAll(a) } }嵌套列表摊平实现
借助列表构造函数先生成对应重复次数的嵌套结构,再通过flatten拍平为一维列表,写法同样简洁:val b = List(3) { a }.flatten()该逻辑先生成包含3个原列表引用的二维嵌套列表,再将所有嵌套层的元素按顺序展开为一维列表,最终效果和直接重复拼接完全一致。
避坑提醒:上述所有实现生成的新列表均为独立存储的内容,修改新列表的元素不会反向影响原列表
a,符合"生成全新列表"的初始要求。不要直接对原可变列表做追加操作,否则会破坏原列表的存储内容。
内容的提问来源于stack exchange,提问作者Nicole Foster
相关产品推荐
相关产品推荐

