Operadores de Comparação
compareTo e equals
Operadores de Comparação é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.
Comparando tipos personalizados
Para usar <, >, <= e >= em seu tipo, defina um operator fun compareTo que retorne um Int.
data class Money(val cents: Int) {
operator fun compareTo(o: Money) = cents - o.cents
}
fun main() {
println(Money(500) > Money(200))
}O contrato de compareTo
compareTo retorna um número negativo se o receptor for menor, zero se forem iguais e um número positivo se for maior.
data class Version(val n: Int) {
operator fun compareTo(o: Version) = n - o.n
}
fun main() {
println(Version(2).compareTo(Version(5)))
}Implementando a comparabilidade
Implementar a interface Comparable<T> é a abordagem idiomática; o método compareTo dela já é um operador.
data class Score(val value: Int) : Comparable<Score> {
override fun compareTo(other: Score) = value - other.value
}
fun main() {
println(Score(10) < Score(20))
}Ordenando com tipos comparáveis
Quando um tipo é comparável, funções de coleção como sorted() funcionam automaticamente.
data class Player(val rank: Int) : Comparable<Player> {
override fun compareTo(other: Player) = rank - other.rank
}
fun main() {
val sorted = listOf(Player(3), Player(1), Player(2)).sorted()
println(sorted.map { it.rank })
}Usando compareValuesBy
Para comparações com vários campos, compareValuesBy compara cada seletor na ordem.
data class Person(val age: Int, val name: String) : Comparable<Person> {
override fun compareTo(other: Person) =
compareValuesBy(this, other, { it.age }, { it.name })
}
fun main() {
println(Person(30, "Al") < Person(30, "Bo"))
}Igualdade por valor
O operador == chama equals, não compareTo. Substitua equals para controlar a igualdade por valor.
class Id(val value: Int) {
override fun equals(other: Any?) =
other is Id && other.value == value
override fun hashCode() = value
}
fun main() {
println(Id(7) == Id(7))
}equals e hashCode em conjunto
Se você substituir equals, também deverá substituir hashCode para que objetos iguais compartilhem o mesmo hash, mantendo corretas as coleções baseadas em hash.
class Tag(val name: String) {
override fun equals(other: Any?) = other is Tag && other.name == name
override fun hashCode() = name.hashCode()
}
fun main() {
val set = hashSetOf(Tag("a"), Tag("a"))
println(set.size)
}Classes de dados fazem isso por você
Uma data class gera automaticamente equals e hashCode a partir de suas propriedades, portanto == compara por valor.
data class Coord(val x: Int, val y: Int)
fun main() {
println(Coord(1, 2) == Coord(1, 2))
}Igualdade versus identidade
== chama equals (igualdade por valor); === verifica a identidade da referência. Os resultados podem ser diferentes.
data class Box(val n: Int)
fun main() {
val a = Box(1)
val b = Box(1)
println(a == b)
println(a === b)
}Comparando em condições
Com compareTo definido, seu tipo funciona em if e when como os números.
data class Weight(val g: Int) : Comparable<Weight> {
override fun compareTo(other: Weight) = g - other.g
}
fun main() {
val w = Weight(50)
println(if (w > Weight(40)) "heavy" else "light")
}maxOf e minOf
Tipos comparáveis funcionam com maxOf e minOf.
data class T(val v: Int) : Comparable<T> {
override fun compareTo(other: T) = v - other.v
}
fun main() {
println(maxOf(T(3), T(8)).v)
}Teste rápido
Teste sua compreensão sobre operadores de comparação.
Recapitulação
Você aprendeu sobre operadores de comparação:
compareToimplementa<,>,<=e>=, retornando um valor negativo, zero ou positivo.- Implemente
Comparable<T>para obter ordenação e classificação idiomáticas. ==usaequals; sempre associe-o ahashCode.- Classes de dados geram
equals/hashCodeautomaticamente.
data class S(val v: Int) : Comparable<S> {
override fun compareTo(other: S) = v - other.v
}
fun main() {
println(S(2) < S(5))
}Perguntas Frequentes
A aula “Operadores de Comparação” é grátis?
Sim — o texto completo de “Operadores de Comparação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.
O que vou aprender em “Operadores de Comparação”?
compareTo e equals Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Kotlin Academy?
Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Operadores de Comparação”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Kotlin Academy?
Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Funções de Operador
- Operadores de Comparação
- Índice e Invocação
- Boas Práticas