kotlin 中使用 .contains 方法忽略变量?

问题描述 投票:0回答:1

忽略 contains 函数中的属性。我的意思是,如果属性值发生变化,它仍然是同一个对象。

我已经在 RecyclerView android 中实现了对象跟踪。现在,当通过单击

heart icon
来收藏某些产品时。它的属性之一

 isFavourite = true /// become true

RecyclerView
onScrollStateChanged

上调用以下方法
 private fun trackVisibleItems(visiblePositions: IntRange) {
    for (position in visiblePositions) {
        if (position != -1) {
            trackableCollectionCallback?.getViewedItem(position)?.let {
                if(isPresent() && shownTrackablePositions.contains(it).not()){
                    it.trackView()
                    trackableCollectionCallback?.onTrackedItem(it,position)
                    shownTrackablePositions.add(it)
                }
            }
        }
    }
}  

现在从任意

heart icon
选择
product
后。属性名称 isFavourite 已在数据库中更新。我想忽略 contains 中的变量。

我尝试在 kotlin 中编写一个 data 类,并将 isFavourite 从基本构造函数中取出,这样 equal 、 hash 等就不起作用了。

但包含匹配所有属性的函数。我怎么能忽略 contains 中的 var。

TrackableObject.kt

abstract class TrackableObject {
    abstract fun getClickEventName(): String
    abstract fun getViewEventName(): String
    abstract fun getTrackParams(): MutableSet<Pair<String, Any>>

    fun trackClick() {
        Analytics.trackEvent(getClickEventName(), getTrackParams())
    }

    fun trackView() {
        Analytics.trackEvent(getViewEventName(), getTrackParams())
    }
}

                   
android list kotlin contains
1个回答
0
投票

将属性移出构造函数应该可以。它应该看起来像这样:

data class MyItem(
    val id: Long,
    val foo: String
) {
    var isFavourite: Boolean = false
}

但是,我认为最好将其保留在构造函数中,这样就不会为了其他目的而破坏

equals
/
hashCode
功能,例如在 DiffUtil 中使用它们。

在这种情况下,您可以使用

any
代替
contains
。由于您必须手动检查所有属性,因此我将其分解为一个函数以使您的逻辑更具可读性。

data class MyItem(
    val id: Long,
    val foo: String,
    var isFavourite: Boolean = false
)

fun Iterable<MyItem>.containsMatch(item: MyItem): Boolean = any { 
    it.id == item.id && it.foo == item.foo
}

// ...

 if(isPresent() && shownTrackablePositions.containsMatch(it).not()){
       it.trackView()
       trackableCollectionCallback?.onTrackedItem(it,position)
       shownTrackablePositions.add(it)
 }   
© www.soinside.com 2019 - 2024. All rights reserved.