Comparar class de datos en Kotlin sin ID

Tengo una class de datos en Kotlin, que tiene varias properties, una de las cuales es ID . Pero cuando realmente uso la function de compare en el código, me gustaría excluir esta propiedad de ID al comparar. ¿Hay alguna manera de hacer eso, excepto la function de compare manual de calcomanías?

Puede usar la function copy() en una de sus instancias de class de datos para crear una copy "alterando algunas de sus properties". p.ej:

 data class User(val id: Long, val name: String) val a = User(1, "John") val b = User(2, "John") println(a == b) // false println(a.copy(id = b.id) == b) // true 

Crear una copy de una de sus instancias de class de datos y alterar el id para que sea igual a la otra instancia con la que desea comparar permite ignorar efectivamente esa propiedad.

También puede copyr ambas instancias de la class de datos y establecer el id con algún valor común, pero si solo hace comparaciones puntuales, esto sería una llamada innecesaria a copy() .

Una class de datos genera la function equals (no se genera la compare ) en function de las properties que se declaran en el constructor primario, por lo que si no quiere comparar las ID, tendrá que mover la propiedad ID fuera del constructor primario .

La parte obvia es que debe mover la propiedad al cuerpo de la class, pero también tendrá que convertirla en var ya que no se inicializará en el constructor principal (no puede ser una val e inicializarlo a un valor pnetworkingeterminado en el bloque init , porque entonces no se puede asignar a él en el constructor secundario).

Un ejemplo de cómo puedes hacer esto:

 data class User(val id: Long, val name: String) data class ModifiedUser(val name: String) { var id: Long = 0 constructor(id: Long, name: String) : this(name) { this.id = id } } val u1 = User(1, "John") val u2 = User(2, "John") println(u1 == u2) // false val m1 = ModifiedUser(1, "Sally") val m2 = ModifiedUser(2, "Sally") println(m1 == m2) // true 

hashCode usted decidir qué manera le conviene más, pero quizás es más fácil anular equals ( y, por hashCode , hashCode ) para get el resultado deseado, al less contiene el código relacionado con esto en un solo lugar, mientras que el anterior La solución puede complicar bastante tu class.

  • Interoperabilidad de Kotlin JS y GWT
  • ¿Puede un número integer en Kotlin ser igual a una expresión matemática?
  • ¿Cuál es la syntax para Class <? extiende class_name> en kotlin?
  • método getter arrojando StackOverflowError
  • Acceda a Integer.class desde Kotlin
  • Gradle Kotlin DSL: Defina la versión de Kotlin en un lugar único
  • GoogleApiClient: No se puede conectar y ejecutar manualmente el inicio de session después
  • Convirtiendo un Observable en un Flujo con contrapresión en RxJava2
  • Android: no se puede actualizar Listview usando CustomAdapter
  • Prueba RxJava2 Flowable Query Room
  • Kotlin nombró la syntax del parámetro para el cierre / lambda