Fundamentos de Kotlin
Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Collections (coleções)
Neste capítulo, apresentaremos uma breve introdução às coleções (collections) em Kotlin. O conceito de coleções não é uma novidade do Kotlin, esse conceito já está presente em muitas outras linguagens de programação. A biblioteca padrão Kotlin fornece um conjunto de ferramentas para criar e gerenciar coleções.
O que são coleções?
Uma coleção (collection) é um grupo de objetos do mesmo tipo. Os objetos dentro de uma coleção são conhecidos como elementos ou itens.
Tipos de coleções
Existem três tipos de coleções em Kotlin:
- Listas
- Set
- Map
A biblioteca padrão Kotlin fornece métodos para criar os objetos de list (lista), set e map. De acordo com o requisito, cada um deles pode ser uma:
- Coleção imutável (somente leitura)
- Coleção Mutável (tanto leitura quanto escrita)
Coleção imutável
Coleções imutáveis são herdadas da interface Collection<T>
que não fornece funcionalidade para adicionar ou remover elementos.
Em coleções imutáveis, um elemento não pode ser adicionado , removido ou alterado após a declaração.
Após definir a coleção imutável, podemos apenas ler seus elementos.
A coleção imutável é simplesmente conhecida como coleção também.
Coleção Mutável
Como o nome sugere, as coleções mutáveis permitem operações de escrita e leitura. Em coleções mutáveis podemos adicionar, remover e alterar os valores dos elementos.
As coleções mutáveis são herdadas da interface MutableCollection<T>
que fornece funcionalidade para ler e alterar elementos.
Elas também herdam funcionalidades básicas das interfaces de coleção correspondentes.
Listas
Listas (lists) são:
- Uma coleção ordenada de elementos.
- A ordem é mantida através de índices (como acontece com os arrays).
- Um elemento pode ocorrer mais de uma vez em uma lista.
- A lista mutável pode ser considerada um array dinâmico cujo tamanho pode ser alterado.
Em Kotlin podemos ter uma lista mutável e uma lista imutável.
Lista imutável
Listas imutáveis são criadas usando a interface List
. A interface List
herda a interface Collection<T>
.
Ela contém muitas funções úteis como contains()
, indexOf()
, isEmpty()
, etc.
Em Kotlin, podemos criar uma lista imutável usando funções listOf()
e listOf<T>()
.
A função listOf()
é usada para criar uma lista geral que pode ter qualquer objeto como Integers, Strings, Floats etc.
A função listOf<T>()
é usada para criar uma lista de tipo específico.
Vamos criar uma lista usando essas duas funções no exemplo abaixo.
Exemplo:
No exemplo anterior criamos duas listas: uma de tipo genérico e outra de Strings.
Percorrer uma lista:
Para percorrer uma lista podemos utilizar o for
, como no exemplo abaixo.
Exemplo:
Funções e propriedades da lista
Algumas funções e propriedades importantes fornecidas na interface List
são:
Propriedades:
size
: representa o número de elementos presentes na lista.lastIndex
: representa o índice do último elemento da lista.
Funções:
get(index)
: Retorna o elemento no índice especificado na lista ou lançaIndexOutOfBoundsException
.contains(element)
: Retorna verdadeiro se o elemento existir na lista ou retorna falso.indexOf(element)
: Retorna o índice da primeira ocorrência do elemento especificado na lista, ou -1 se o elemento especificado não estiver contido na lista.lastIndexOf(element)
: Retorna o índice da última ocorrência do elemento especificado na lista, ou -1 se o elemento especificado não estiver contido na lista.first()
: Retorna o primeiro elemento na lista ou lançaNoSuchElementException
se a lista estiver vazia.last()
: Retorna o último elemento da lista ou lançaNoSuchElementException
se a lista estiver vazia.isEmpty()
: Retorna verdadeiro se a lista estiver vazia, senão falso.subList(start, end)
: Retorna uma sublista entre o início (inclusivo) e o final (exclusivo).
Exemplo:
Lista Mutável
As listas mutáveis são criadas usando a interface MutableList
. A interface MutableList
também herda a interface Collection
.
As listas mutáveis são dinâmicas por natureza. Podemos adicionar ou remover elementos da lista mutável após sua declaração.
Portanto, o tamanho da lista mutável não é fixo.
Semelhante às listas imutáveis, as listas mutáveis são criadas usando as funções mutableListOf()
e mutableListOf<T>()
.
A função mutableListOf()
é usada para criar uma lista geral que pode ter qualquer objeto como Integers, Strings, Floats etc.
A função mutableListOf<T>()
é usada para criar uma lista de tipo específico.
Vamos criar listas mutáveis usando estes métodos no exemplo abaixo.
Exemplo:
Todas as propriedades e métodos que estão presentes em listas imutáveis também estão presentes nas listas mutáveis, mas as listas mutáveis têm algumas funções extras para suportar a mutabilidade:
add(element)
: Adiciona o elemento especificado ao final da lista.add(index, element)
: Insere um elemento na lista no índice especificado.remove(element)
: Remove a primeira ocorrência do elemento da lista.removeAt(index)
: Remove um elemento no índice especificado da lista.set(index, element)
: Substitui o elemento no índice especificado nesta lista pelo elemento especificado.clear()
: remove todos os elementos da lista.
Exemplo usando estes métodos:
Set
Sets (ou conjuntos) são:
- Uma coleção desordenada de elementos.
- Elementos duplicados não são permitidos nos sets.
Em Kotlin podemos ter um set (conjunto) mutável e um set (conjunto) imutável.
Set imutável
Sets imutáveis são criados usando a interface Set
. A interface Set
herda a interface Collection
.
Em Kotlin, podemos criar sets imutáveis usando as funções setOf()
e setOf<T>()
.
A função setOf()
é usada para criar um set geral que pode ter qualquer objeto como Integers, Strings, Floats etc.
A função setOf<T>()
é usada para criar um set de tipo específico.
Exemplo:
No exemplo anterior criamos dois sets: um de tipo genérico e outro de strings.
Para percorrer um set podemos utilizar um for
, como no exemplo a seguir.
Exemplo:
Propriedades e funções dos sets
Algumas funções e propriedades importantes fornecidas na interface Set
são:
Propriedades:
size
: representa o número de elementos presentes no conjunto.
Funções :
elementAt(index)
: Retorna o elemento no índice especificado no set ou lançaIndexOutOfBoundsException
.contains(element)
: Retornatrue
se o elemento existe no set ou retornafalse
.indexOf(element)
: Retorna o índice do elemento especificado no set, ou -1 se o elemento especificado não estiver presente no set.lastIndexOf(element)
: Retorna o índice da última ocorrência (ou a única ocorrência) do elemento especificado no set, ou -1 se o elemento especificado não estiver presente no set.first()
: Retorna o primeiro elemento no set ou lançaNoSuchElementException
se o set estiver vazio.last()
: Retorna o último elemento do set ou lançaNoSuchElementException
se o set estiver vazio.isEmpty()
: Retornatrue
se o set estiver vazio, se não estiver retornafalse
.count()
: Retorna o número de elementos nesta coleção.max()
: Retorna o maior elemento ounull
se não houver elementos.min()
: Retorna o menor elemento ounull
se não houver elementos.sum()
: Retorna a soma de todos os elementos desta coleção.average()
: Retorna a média de todos os elementos nesta coleção.
Exemplo:
Set Mutável
Sets mutáveis são criados usando a interface MutableSet
. A interface MutableSet
também herda a interface Collection
.
Sets mutáveis são dinâmicos por natureza. Podemos adicionar ou remover elementos do set mutável após sua declaração.
Portanto, o tamanho do set mutável não é fixo.
Semelhante aos sets imutáveis, os sets mutáveis são criados usando as funções mutableSetOf()
e mutableSetOf<T>()
.
A função mutableSetOf()
é usada para criar um set geral enquanto mutableSetOf<T>()
é usada para criar um set de tipo específico.
Exemplo:
Todas as propriedades e métodos que estão presentes em sets imutáveis também estão presentes no caso de sets mutáveis, mas os sets mutáveis têm algumas funções extras para suportar a mutabilidade:
add(element)
: Adiciona o elemento especificado ao set. Retornatrue
se o elemento foi adicionado,false
se o elemento já está contido no set.remove(element)
: Remove o elemento do set.clear()
: Remove todos os elementos do set.
Exemplo:
Map
Os maps são usados para armazenar pares de chave e valor. Tanto a chave quanto o valor são definidos pelo usuário. Em um map:
- A chave deve ser exclusiva e apenas um valor pode ser armazenado para cada chave exclusiva.
- Os valores podem ser duplicados.
- A chave e o valor podem ser de tipos de dados diferentes.
- A palavra-chave
to
é usada para mapear uma chave para um valor. - Um par chave-valor também é conhecido como uma entrada.
Em Kotlin podemos ter um map mutável e um map imutável.
Map imutável Kotlin
Maps imutáveis são criados usando a interface Map<K, V>
. A partir de maps imutáveis, só podemos fazer leitura.
Em Kotlin, maps imutáveis são criados usando funções mapOf()
e mapOf<K, V>()
. Semelhante às listas, a função mapOf()
é usada para criar um map geral onde a chave e o valor podem ser de qualquer tipo de dados.
O mapOf<K, V>()
é usado para criar um mapa específico com chaves e valores dos tipos de dados K e V, respectivamente.
Exemplo:
É possível percorrer esses maps usando for
e forEach
:
Exemplo:
Propriedades e funções do map
Algumas funções e propriedades importantes fornecidas na interface Map são:
Propriedades:
size
: Retorna o tamanho do map.entries
: retorna o conjunto de todos os pares de chave-valor no map.keys
: Retorna o conjunto de todas as chaves no map.values
: Retorna o conjunto de todos os valores no map.
Funções:
get(key)
: Retorna o valor da chave correspondente. Se a chave estiver ausente, retornaránull
.getValue(key)
: Retorna o valor para a chave fornecida ou lançaNoSuchElementException
se não houver tal chave no map.contains(key)
: Retornatrue
se o map contiver a chave especificada senão retornafalse
.containsKey(key)
: Retornatrue
se o map contiver a chave especificada senão retornafalse
. Esta função é a mesma que a anterior.containsValue(value)
: Retornatrue
se houver uma ou mais chaves para o valor especificado presente no map.getOrDefault(key, defaultValue)
: Retorna o valor correspondente à chave, oudefaultValue
se tal chave não estiver presente no map.
Exemplo:
Map Mutável
Os maps mutáveis são criados usando a interface MutableMap
. Os maps mutáveis suportam a natureza dinâmica.
Podemos adicionar ou remover ou atualizar entradas do map mutável após sua declaração. Portanto, o tamanho do map mutável não é fixo.
Maps mutáveis são criados usando funções mutableMapOf()
e mutableMapOf<K, V>()
.
A função mutableMapOf()
é usada para criar um mapa generalizado e a mutableMapOf<K, V>()
é usada para criar um map de chave e valor de tipos específicos.
Exemplo:
Podemos percorrer maps mutáveis da mesma forma que percorremos maps imutáveis.
Todas as propriedades e funções que estão presentes em maps imutáveis também estão presentes no caso de maps mutáveis. Os maps mutáveis têm algumas funções extras para suportar a natureza dinâmica. Elas são:
put(key, value)
: adiciona o par chave-valor especificado ao map. Se a chave já existir, o valor desse novo par substituirá o valor antigo.putIfAbsent(key, value)
: adiciona o par chave-valor especificado ao map somente se a chave não existir anteriormente.replace(key, newValue)
: Substitui o valor da chave especificada pelo novo valor.replace(key, oldValue, newValue)
: substitui o valor antigo pelo novo valor para a chave especificada somente se o par key e oldValue existir.remove(key)
: Remove a entrada com a chave especificada do map.remove(key, value)
: Remove a entrada do map se existir uma entrada com a chave e o valor especificados.clear()
: remove todas as entradas do map.
Exemplo: