Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 检查两个对象的某些(不是全部)属性在Kotlin中是否相等的惯用方法_Android_Kotlin_Equality - Fatal编程技术网

Android 检查两个对象的某些(不是全部)属性在Kotlin中是否相等的惯用方法

Android 检查两个对象的某些(不是全部)属性在Kotlin中是否相等的惯用方法,android,kotlin,equality,Android,Kotlin,Equality,假设我有一个包含两个实例的类: class Car(val id: Int, val color: Color, val pistons: Int, val spoiler: Boolean) val audi = Car(1234, Color.BLUE, 8, false) val bmw = Car(4321, Color.WHITE, 6, false) 现在我想检查一些属性的相等性(不是全部->在这种情况下我会使用数据类) 我现在正在寻找一种进行比较的方法: 对于更通用的对象T及

假设我有一个包含两个实例的类:

class Car(val id: Int, val color: Color, val pistons: Int, val spoiler: Boolean)

val audi = Car(1234, Color.BLUE, 8, false)
val bmw = Car(4321, Color.WHITE, 6, false)
现在我想检查一些属性的相等性(不是全部->在这种情况下我会使用数据类)

我现在正在寻找一种进行比较的方法:

  • 对于更通用的对象
    T
    及其属性
  • 更惯用的说法是:没有人愿意阅读大量的相等检查
  • 同样快

我提出了以下建议:

fun <T> Pair<T, T>.equalIn(vararg arguments: (T) -> Any?) =
    arguments.toList().all { it(first) == it(second) }
是否有人知道更好(例如更清洁/更快)的解决方案


我的用例如下所示:

我正在编写一个Android应用程序,其中包含多个
RecyclerView
(=显示列表的奇特视图)

每个
RecyclerView
都有一个
ListAdapter
(负责底层列表)

每个
ListAdapter
都需要一个
DiffUtil.ItemCallback
(用于比较新旧项并在视图中启动适当的更改)

val callback=object:DiffUtil.ItemCallback(){
覆盖乐趣项相同(旧项:汽车,新项:汽车):布尔值
//通常检查id,例如oldItem.id==newItem.id
覆盖乐趣内容相同(旧项:汽车,新项:汽车):布尔值
//检查两个项目是否看起来相同。
//用于afaik的奇特进入/退出动画。
//例如(oldItem到newItem).equalIn({it.color},{it.spoiler})
}

Tbh,我更喜欢简单愚蠢的平等检查,而不是任何更花哨的检查,因为每个人都知道它们的外观和工作原理。我花了将近2分钟的时间才完全理解您的函数的功能以及它是如何工作的。如果只有简单的相等性检查,我在阅读代码时会在一秒钟内理解它们。在使用网站上编写
。equalIn(Car::color,Car::spoiler)
会更干净。否则,我觉得你的方式很好。也许需要中间的一对会有点尴尬。除此之外,这是创建函数对象和数组来进行检查,因此有一点GC搅动,这是直接使用
=
比较所不会有的。如果使用
数据类
而不是使用
,则不需要这些,它允许结构比较,只需说
a==b
,您的
活塞
也必须是一个数据类。通常在diff-item回调中,
是项相同的
是ids比较,然后在您使用的内容上,
oldItem==newItem
@vatbub我同意,目前阅读并不完美;但这是我个人问题的一部分,而不是扩展函数,我可能会创建某种比较类(比如只处理
等于
比较器
),这样您就可以创建它的实例,按照您喜欢的方式配置,并在所有检查中使用它。您可以在构建过程中传入属性列表,定义它应该执行的所有检查,然后创建一次-如果需要,您可以有不同的变体。我非常喜欢简单的愚蠢的相等检查,而不是任何更奇特的检查,因为每个人都知道它们的外观和工作方式。我花了将近2分钟的时间才完全理解您的函数的功能以及它是如何工作的。如果只有简单的相等性检查,我在阅读代码时会在一秒钟内理解它们。在使用网站上编写
。equalIn(Car::color,Car::spoiler)
会更干净。否则,我觉得你的方式很好。也许需要中间的一对会有点尴尬。除此之外,这是创建函数对象和数组来进行检查,因此有一点GC搅动,这是直接使用
=
比较所不会有的。如果使用
数据类
而不是使用
,则不需要这些,它允许结构比较,只需说
a==b
,您的
活塞
也必须是一个数据类。通常在diff-item回调中,
是项相同的
是ids比较,然后在您使用的内容上,
oldItem==newItem
@vatbub我同意,目前阅读并不完美;但这是我个人问题的一部分,而不是扩展函数,我可能会创建某种比较类(比如只处理
等于
比较器
),这样您就可以创建它的实例,按照您喜欢的方式配置,并在所有检查中使用它。您可以在构建期间传入属性列表,定义它应该执行的所有检查,然后创建一次-如果需要,您可以使用不同的变体
fun <T> Pair<T, T>.equalIn(vararg arguments: (T) -> Any?) =
    arguments.toList().all { it(first) == it(second) }
val looksSimilar = (audi to bmw).equalIn({it.color}, {it.spoiler})
val callback = object : DiffUtil.ItemCallback<Car>() {

    override fun areItemsTheSame(oldItem: Car, newItem: Car): Boolean
    // usually checks for id, e.g. oldItem.id == newItem.id

    override fun areContentsTheSame(oldItem: Car, newItem: Car): Boolean
    // checks if two items look the same.
    // Used for fancy enter/exit animations afaik.
    // e.g. (oldItem to newItem).equalIn({it.color}, {it.spoiler})
}