Ich habe eine Datenklasse in Kotlin, die eine Anzahl von Eigenschaften hat, von denen eine ID
ist. Aber wenn ich tatsächlich compare
Funktion im Code verwende, möchte ich diese ID
Eigenschaft beim Vergleich ausschließen. Gibt es eine Möglichkeit, dies zu tun, außer die Funktion compare
manuell zu kneten?Vergleichen Sie Datenklasse in Kotlin ohne ID
Antwort
Sie können die copy()
function für eine Ihrer Datenklassenexemplare verwenden, um eine Kopie davon zu erstellen "einige seiner Eigenschaften zu ändern". z.B .:
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
eine Kopie eines Ihrer Datenklasseninstanzen erstellen und die ID zu ändern die gleiche wie die andere Instanz, die Sie gegen ermöglicht effektiv vergleichen sein wollen, um diese Eigenschaft zu ignorieren.
Sie könnten auch beide Datenklassenexemplare kopieren und id
auf einen gemeinsamen Wert setzen, aber wenn Sie nur einmalige Vergleiche durchführen, wäre dies ein unnötiger Aufruf an copy()
.
Eine Datenklasse erzeugt die equals
Funktion auf die Eigenschaften (compare
nicht erzeugt wird) basiert, die in dem primären Konstruktor deklariert sind, also wenn Sie wollen, dass es nicht die IDs zu vergleichen, finden Sie die ID
Eigenschaft heraus bewegen müssen des primären Konstruktors.
Der offensichtliche Teil ist, dass Sie die Eigenschaft in den Rumpf der Klasse verschieben müssen, aber dann müssen Sie es auch eine var
machen, da es nicht im primären Konstruktor initialisiert wird (Sie können nicht Sei es ein val
und initialisiere es auf einen Standardwert im init
Block, denn dann kannst du es im sekundären Konstruktor nicht zuweisen).
ein Beispiel, wie Sie dies tun können:
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
Es ist an Ihnen besser, welchen Weg zu Ihnen passt zu entscheiden, aber es ist vielleicht am einfachsten nur equals
(and by implication, hashCode
) außer Kraft zu setzen, das gewünschte Ergebnis zu erhalten, bei Zumindest enthält es den Code, der damit nur einmal in Verbindung steht, während die obige Lösung Ihre Klasse ziemlich kompliziert machen kann.
Wow, all das nicht 'equals' zu schreiben? – voddan
- 1. Datenklasse Gleichheit in Kotlin
- 2. Json nach Kotlin Datenklasse
- 3. Kotlin Datenklasse von RealmObject
- 4. Firebase @Exclude mit Kotlin Datenklasse
- 5. Kotlin Datenklasse Gson Serialisierung Ausgabe
- 6. memoization der Member-Funktion von Kotlin Datenklasse
- 7. Kotlin-Datenklasse zu JSON mit Spring/Jackson
- 8. Vergleichen NaN in Kotlin
- 9. Vergleichen von Vergleichslisten in Kotlin
- 10. Vergleichen String Kotlin
- 11. Warum hat kotlin componentN-Funktionen in der Datenklasse, wenn sie bereits Getters und Setter haben?
- 12. So erstellen Sie einen leeren Konstruktor für die Datenklasse in Kotlin Android
- 13. Gibt es eine Möglichkeit, eine Kotlin-Datenklasse aus einer regulären Kotlin-Klasse zu identifizieren?
- 14. Contraints auf dem Formular ohne eine Datenklasse
- 15. Vergleichen Sie eine TextView mit einer Zeichenfolge in Kotlin
- 16. Gibt es eine Möglichkeit zu verlangen, dass ein generischer Typ eine Datenklasse in Kotlin ist?
- 17. Kotlins Datenklasse, Android Room und benutzerdefinierte Setter
- 18. Kotlin Konstruktorparameter ohne Getter
- 19. Include -Eigenschaft deklariert im Körper der Datenklasse in toString() in Kotlin
- 20. Gradle kotlin script,> Plugin mit id `kotlin` nicht gefunden
- 21. Verwenden Sie @ClassRule in Kotlin
- 22. Vergleichen Sie zwei Dateien ohne Reihenfolge
- 23. Kotlin Getter Override + MongoDB
- 24. Plugin mit ID `kotlin` nicht gefunden
- 25. Gemeinsame Datenklasse mit std :: shared_ptr
- 26. Kotlin Erweiterungseigenschaften funktionieren nicht in Kotlin Skript
- 27. Vergleichen DateTime ohne Jahr
- 28. Linq zu Sql Datenklasse in dbml
- 29. Vergleichen Sie DatetimeOffset ohne Zeit in LINQ mit Entities
- 30. Vergleichen Sie zwei Listen in Excel (ohne Makros?)
Das sieht genau so aus, wie ich gesucht habe. Ich kann solche Vergleichsmethode in der Datenklasse selbst in 1 Zeile implementieren. Vielen Dank. – arslancharyev31