You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:05:22