Kotlin嵌套列表实例化默认含空元素的原因与规避方法
问题原因
你遇到的这个现象是因为mutableListOf()的构造函数重载逻辑:
- 示例1中
mutableListOf<String>()调用的是无参构造函数,初始化出一个空列表,后续add两个元素后长度为2,符合预期。 - 示例2中
mutableListOf(mutableListOf<String>())调用的是接受可变数量元素的构造函数,你把那个空的子列表作为第一个元素直接传入了外层列表,所以初始化完成后,外层列表已经包含1个空的子列表。之后你又add了2个子列表,总长度自然是1+2=3。
优雅的规避方式
1. 从初始化阶段直接避免(推荐)
调用无参的mutableListOf,明确指定外层列表的泛型类型,这样初始化出来的就是空的外层列表:
val testList2 = mutableListOf<MutableList<String>>() testList2.add(mutableListOf("sf", "fgs")) testList2.add(mutableListOf("sw", "fgg")) Toast.makeText(this, testList2.size.toString(), Toast.LENGTH_SHORT).show() // 显示长度为2
这种方式从根源解决问题,不需要后续清理操作,是最简洁合理的写法。
2. 若需初始化时传入非空初始子列表
如果业务场景需要外层列表一开始就包含某些非空的子列表,直接传入这些非空列表即可,不要传入空列表作为初始元素:
// 初始化时传入一个非空子列表,后续add两个,总长度为3(符合预期) val testList2 = mutableListOf(mutableListOf("initial", "item")) testList2.add(mutableListOf("sf", "fgs")) testList2.add(mutableListOf("sw", "fgg"))
3. 已存在初始空列表时的清理(仅作补充,不推荐)
如果已经写出了带初始空列表的代码,除了removeIf,还可以用更简洁的removeAll,但这种方式属于事后补救,不如从初始化阶段避免:
testList2.removeAll { it.isEmpty() }
内容的提问来源于stack exchange,提问作者Kratos
相关产品推荐
相关产品推荐

