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çaNoSuchElementExceptionse a lista estiver vazia.last(): Retorna o último elemento da lista ou lançaNoSuchElementExceptionse 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): Retornatruese 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çaNoSuchElementExceptionse o set estiver vazio.last(): Retorna o último elemento do set ou lançaNoSuchElementExceptionse o set estiver vazio.isEmpty(): Retornatruese o set estiver vazio, se não estiver retornafalse.count(): Retorna o número de elementos nesta coleção.max(): Retorna o maior elemento ounullse não houver elementos.min(): Retorna o menor elemento ounullse 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. Retornatruese o elemento foi adicionado,falsese 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çaNoSuchElementExceptionse não houver tal chave no map.contains(key): Retornatruese o map contiver a chave especificada senão retornafalse.containsKey(key): Retornatruese o map contiver a chave especificada senão retornafalse. Esta função é a mesma que a anterior.containsValue(value): Retornatruese houver uma ou mais chaves para o valor especificado presente no map.getOrDefault(key, defaultValue): Retorna o valor correspondente à chave, oudefaultValuese 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: