Kotlin中如何修复批量添加List<MVoice>的id到MutableSet的简化代码?
问题解答
1. 能否将List元素添加到MutableSet中?
当然可以!不过有个关键前提:你的MVoice类需要能正确区分不同实例——如果是data class,Kotlin会自动帮你生成equals()和hashCode()方法,Set就能准确判断元素是否重复;如果是普通class,你得自己实现这两个方法,不然Set会把所有实例都当成不同元素(哪怕内容完全一致)。
示例代码:
val voiceSet: MutableSet<MVoice> = mutableSetOf() listVoiceBySort.value?.let { voiceList -> voiceSet.addAll(voiceList) }
2. 修复代码B的问题
你的代码B无法运行的核心原因是:it是List<MVoice>类型,它本身并没有id属性!你需要先把List里的每个MVoice对象映射成对应的id(转成List<Int>),再调用addAll()批量添加。
修复后的代码:
val selectedIDs: MutableSet<Int> = mutableSetOf() val listVoiceBySort: LiveData<List<MVoice>> = _listVoiceBySort listVoiceBySort.value?.let { voiceList -> // 先将每个MVoice转为id,再批量添加到Set selectedIDs.addAll(voiceList.map { it.id }) // 也可以用方法引用简化写法:voiceList.map(MVoice::id) }
另外补充个小建议:如果LiveData的数据会动态更新,更稳妥的方式是通过observe()监听数据变化,而不是直接取value(value可能为空,且仅能在主线程安全获取),示例如下:
listVoiceBySort.observe(lifecycleOwner) { voiceList -> selectedIDs.clear() selectedIDs.addAll(voiceList.map(MVoice::id)) }
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

