Kotlin MutableList的removeAll方法失效问题咨询
MutableList.removeAll() 失效问题解决
你的代码里,orderList.addAll(allProducts)能正常添加元素,但orderList.removeAll(allProducts)却无法移除这些元素,问题出在Product类没重写equals()和hashCode()方法。
Kotlin集合的removeAll()是靠元素的equals()方法判断“是否为同一个元素”的,默认的equals()只比较对象的内存地址。而你用的Product继承了EmbeddedRealmObject,Realm的嵌入对象可能会生成代理实例——就算两个Product的字段完全一致,只要内存地址不同,equals()就会判定它们不是同一个元素,导致removeAll()找不到要删除的对象。
解决办法
给Product类重写equals()和hashCode(),用类里的字段来判断对象是否相等:
class Product : EmbeddedRealmObject { var name: String = "" var category: String = "" var productDescription: String? = "" var price: Float = 0F var imagine: String? = null override fun equals(other: Any?): Boolean { if (this === other) return true // 同一引用直接判定相等 if (other !is Product) return false // 类型不一致直接判定不相等 // 比较所有字段判断内容是否一致 return name == other.name && category == other.category && productDescription == other.productDescription && price == other.price && imagine == other.imagine } override fun hashCode(): Int { var result = name.hashCode() result = 31 * result + category.hashCode() result = 31 * result + (productDescription?.hashCode() ?: 0) result = 31 * result + price.hashCode() result = 31 * result + (imagine?.hashCode() ?: 0) return result } }
注意事项
- 选择判断相等的字段时,优先用能唯一标识产品的属性(比如有id字段就优先用id,没有则组合name、category这类不会轻易变更的字段)。
- 重写
equals()必须同时重写hashCode(),这是Java/Kotlin的约定,否则集合类可能出现逻辑混乱的问题。
内容的提问来源于stack exchange,提问作者Cipri
相关产品推荐
相关产品推荐

