Fundamentos de Kotlin

brigida_oliveira
19.2K views

Open Source Your Knowledge, Become a Contributor

Technology knowledge has to be shared and made accessible for free. Join the movement.

Create Content

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:

  1. Listas
  2. Set
  3. 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:

  1. Coleção imutável (somente leitura)
  2. 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ça IndexOutOfBoundsException.
  • 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ça NoSuchElementException se a lista estiver vazia.
  • last(): Retorna o último elemento da lista ou lança NoSuchElementException 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ça IndexOutOfBoundsException.
  • contains(element): Retorna true se o elemento existe no set ou retorna false.
  • 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ça NoSuchElementException se o set estiver vazio.
  • last(): Retorna o último elemento do set ou lança NoSuchElementException se o set estiver vazio.
  • isEmpty(): Retorna true se o set estiver vazio, se não estiver retorna false.
  • count(): Retorna o número de elementos nesta coleção.
  • max(): Retorna o maior elemento ou null se não houver elementos.
  • min(): Retorna o menor elemento ou null 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. Retorna true 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ça NoSuchElementException se não houver tal chave no map.
  • contains(key): Retorna true se o map contiver a chave especificada senão retorna false.
  • containsKey(key): Retorna true se o map contiver a chave especificada senão retorna false. Esta função é a mesma que a anterior.
  • containsValue(value): Retorna true se houver uma ou mais chaves para o valor especificado presente no map.
  • getOrDefault(key, defaultValue): Retorna o valor correspondente à chave, ou defaultValue 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:

Open Source Your Knowledge: become a Contributor and help others learn. Create New Content