0Pricing
Kotlin Academy · Aula

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:

  • compareTo implementa <, >, <= e >=, retornando um valor negativo, zero ou positivo.
  • Implemente Comparable<T> para obter ordenação e classificação idiomáticas.
  • == usa equals; sempre associe-o a hashCode.
  • Classes de dados geram equals/hashCode automaticamente.
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

  1. Funções de Operador
  2. Operadores de Comparação
  3. Índice e Invocação
  4. Boas Práticas
← Voltar para Kotlin Academy