Criar e usar variáveis em Kotlin

1. Antes de começar

Observe nos apps que você usa no smartphone que algumas partes permanecem iguais, enquanto outras mudam (ou são variáveis).

Por exemplo, os nomes das categorias no app Configurações continuam os mesmos: Rede e Internet, Dispositivos conectados e Apps, entre outros.

72302735e50d7d85.png

Por outro lado, em um app de notícias, os artigos mudam com frequência. O nome, a fonte, a hora da postagem e as imagens do artigo mudam.

Como você pode escrever o código para que o conteúdo mude com o passar do tempo? Não é possível reescrever o código do app sempre que novos artigos forem postados, o que acontece todos os dias, a cada hora e a cada minuto.

Neste codelab, você vai aprender a escrever um código que usa variáveis para que determinadas partes do programa possam mudar sem que seja necessário escrever um novo conjunto de instruções. Vamos usar o Playground Kotlin, como no codelab anterior.

O que você vai criar

  • Programas curtos em Kotlin que usam variáveis.

O que você vai aprender

  • Como definir uma variável e atualizar o valor dela.
  • Como selecionar um tipo de dado adequado para uma variável entre os tipos de dados básicos de Kotlin.
  • Como adicionar comentários ao código.

O que é necessário

  • Um computador com acesso à Internet e um navegador da Web.

2. Variáveis e tipos de dados

Na programação de computadores, existe o conceito de variável, que é um contêiner para um único dado. Você pode o imaginar como uma caixa que contém um valor. A caixa tem um rótulo, que é o nome da variável. Ao fazer referência à caixa pelo nome, você tem acesso ao valor dela.

O diagrama mostra como uma variável pode conter dados, assim como uma caixa pode armazenar algo. Há uma caixa com "name" (nome) escrito nela. Fora da caixa, há um rótulo que diz "value" (valor). Há uma seta que aponta do valor para a caixa. Isso significa que o valor é armazenado na caixa.

Por que armazenar o valor em uma caixa e se referir a ela pelo nome quando você pode usar o valor diretamente? O problema é que, quando o código usa valores diretamente em todas as instruções, o programa só funciona nesse caso específico.

Confira uma analogia que pode ajudar você a entender por que as variáveis são úteis. Confira abaixo uma carta para alguém que você conheceu recentemente.

Olá, Laura.

A nossa conversa hoje no escritório foi ótima. Espero ver você novamente na sexta-feira.

Tenha um bom dia!

Essa carta é boa, mas só funciona para a situação específica com Laura. E se você precisasse escrever a mesma carta muitas vezes, mas com pequenas variações para pessoas diferentes? Seria mais eficiente criar um modelo de carta, deixando espaços em branco para as partes que podem mudar.

Olá, ____.

A nossa conversa hoje _____ foi ótima. Espero ver você novamente ____.

Tenha um bom dia!

Também é possível especificar o tipo de informação que é colocado em cada espaço em branco. Isso garante que o modelo de carta seja usado conforme esperado.

Olá, { nome } .

A nossa conversa hoje { no local } foi ótima. Espero ver você novamente { na data } .

Tenha um bom dia!

Conceitualmente, a criação de um app é semelhante. Você tem marcadores de posição para alguns dados, enquanto outras partes do app continuam iguais.

Esta ilustração mostra um app de notícias de exemplo. O conteúdo da tela começa com uma mensagem de saudação, em que o nome é deixado como um marcador de posição para o nome do usuário. Em seguida, há um texto que diz

Na ilustração acima de um app de notícias, o texto de "Welcome", o título "Latest news for you" e o texto do botão "View more articles" permanecem os mesmos. Por outro lado, o nome do usuário e o conteúdo de cada artigo mudam. Essa seria uma ótima oportunidade de usar variáveis para armazenar cada informação.

A ilustração mostra três caixas alinhadas uma perto da outra. A primeira caixa tem o rótulo "name" (nome). Há um rótulo ao lado que diz

Não faz sentido escrever um código (ou instruções) de app de notícias que funcione apenas para um usuário chamado Alex ou para uma matéria que tenha sempre o mesmo título e a mesma data de publicação. Em vez disso, é necessário ter um app mais flexível. Por isso, escreva o código referenciando nomes de variáveis, como name, article1Name, article1Date e assim por diante. Dessa forma, o código se torna geral o suficiente para funcionar em muitos casos de uso diferentes em que o nome do usuário e os detalhes do artigo podem ser diferentes.

App de exemplo com variáveis

Vamos analisar um app de exemplo para ver onde ele pode usar variáveis.

a7e1f5184e4e3b15.png

Em um app de mapas, você pode encontrar uma tela de detalhes para cada local, como um restaurante ou uma empresa. A captura de tela acima do app Google Maps mostra os detalhes da sede do Google, chamada de Googleplex. Quais dados você acha que são armazenados como variáveis no app?

  • Nome do local
  • Nota do local
  • Número de avaliações recebidas
  • Indicação de que o usuário salvou (ou adicionou aos favoritos) esse local
  • Endereço do local

Quando você muda os dados armazenados nessas variáveis, o app de mapas fica flexível o suficiente para mostrar os detalhes de outros locais também.

Tipos de dados

Ao decidir quais aspectos do app podem ser variáveis, é importante especificar quais tipos de dados podem ser armazenados nessas variáveis. Em Kotlin, há alguns tipos de dados básicos comuns. A tabela abaixo mostra um tipo de dado diferente em cada linha. Para cada tipo, há uma descrição de quais dados ele pode conter e exemplos de valores.

Tipo de dado de Kotlin

Qual dado pode conter

Exemplos de valores literais

String

Texto

"Add contact"
"Search"
"Sign in"

Int

Número inteiro

32
1293490
-59281

Double

Número decimal

2.0
501.0292
-31723.99999

Float

Número decimal, que é menos preciso que um Double e tem f ou F no fim do número.

5.0f
-1630.209f
1.2940278F

Boolean

true ou false. Use esse tipo de dado quando houver apenas dois valores possíveis. true e false são palavras-chave em Kotlin.

true
false

Agora que você conhece alguns tipos de dados comuns do Kotlin, qual deles seria apropriado para cada uma das variáveis identificadas na página de detalhes do local que vimos antes?

a7e1f5184e4e3b15.png

  • O nome do local é um texto. Portanto, pode ser armazenado em uma variável com o tipo de dado String.
  • A nota do local é um número decimal (como 4,2 estrelas) e pode ser armazenada como Double.
  • O número de avaliações do local é um número inteiro, então precisa ser armazenado como um Int.
  • A informação de se o usuário salvou esse local tem apenas dois valores possíveis (salvou ou não). Por isso, ele é armazenado como um Boolean, em que true e false podem representar cada um desses estados.
  • O endereço do local é um texto, portanto, precisa ser uma String.

Pratique nos outros dois cenários abaixo. Identifique o uso de variáveis e dos tipos de dados nos apps abaixo.

  1. Em um app para assistir vídeos, como o YouTube, há uma tela com detalhes do vídeo. Onde as variáveis provavelmente são usadas? Qual é o tipo de dado dessas variáveis?

a1688b9b297c7501.png

Não há somente uma resposta correta, mas em um app de exibição de vídeo, os dados abaixo podem ser armazenados nestas variáveis:

  • Nome do vídeo (String)
  • Nome do canal (String)
  • Número de visualizações do vídeo (Int)
  • Número de marcações "Gostei" no vídeo (Int)
  • Número de comentários no vídeo (Int)
  1. Em um app como Mensagens, a tela lista as mensagens de texto mais recentes recebidas. Onde as variáveis provavelmente são usadas? Qual é o tipo de dado dessas variáveis?

f515a6481cc91bf2.png

Novamente, não há uma única resposta correta. Em um app de mensagens de texto, as variáveis podem ser usadas para os seguintes dados:

  • Número de telefone do remetente (String)
  • Carimbo de data/hora da mensagem (String)
  • Visualização do conteúdo da mensagem (String)
  • Se a mensagem de texto aparece como não lida (Boolean)

Testar

  1. Abra seu app favorito no smartphone.
  2. Identifique onde você acha que são usadas variáveis em uma tela específica do app.
  3. Qual é o tipo de dado dessas variáveis?
  4. Compartilhe suas respostas em mídias sociais com uma captura de tela do app, uma explicação de onde você acha que as variáveis são usadas e a hashtag #AndroidBasics.

Você fez um bom trabalho neste codelab até agora. Vá até a próxima seção para saber mais sobre como as variáveis e os tipos de dados são usados no código.

3. Definir e usar variáveis

Definir ou usar uma variável

Antes de usar uma variável no código, é preciso a definir. Isso é parecido com o que você aprendeu no codelab anterior: como definir funções antes de chamá-las.

Quando você define uma variável, atribui um nome de identificação único a ela. Também é possível decidir o tipo de dado que ela pode conter. Por fim, você pode fornecer um valor inicial que vai ser armazenado na variável, mas isso é opcional.

Depois de definir, você vai poder usar a variável no programa. Para isso, digite o nome dela no código. Isso informa ao compilador Kotlin que você quer usar o valor da variável nesse ponto do código.

Por exemplo, defina uma variável para o número de mensagens não lidas na caixa de entrada de um usuário. A variável pode ter o nome count. Armazene um valor, como o número 2, na variável. Ele indica que há 2 mensagens não lidas na caixa de entrada do usuário. É possível escolher um número diferente para ser armazenado na variável. No entanto, para esse exemplo, use o número 2.

Há uma caixa com o nome "count" (contagem). Fora da caixa, há o rótulo "2". Há uma seta que aponta do valor para a caixa. Isso significa que o valor é armazenado na caixa.

Sempre que o código precisar acessar o número de mensagens não lidas, digite count no código. Ao executar as instruções, o compilador Kotlin vê o nome da variável no código e usa o valor dela.

Tecnicamente, há um vocabulário mais específico para descrever esse processo:

Uma expressão é uma pequena unidade de código que é interpretada como um valor. Uma expressão pode ser composta por variáveis e chamadas de função, entre outros itens. No caso abaixo, a expressão é composta de uma variável: a count. Essa expressão é interpretada como 2.

O diagrama mostra uma expressão ao lado do valor dela. Há um rótulo "expression" (expressão) e abaixo dele o texto "count" (contagem). À direita, há um rótulo "value" (valor) e abaixo dele o número 2.

Interpretar significa determinar o valor de uma expressão. Nesse caso, a expressão é interpretada como 2. O compilador interpreta as expressões do código e usa esses valores ao executar as instruções no programa.

O objetivo do diagrama é mostrar que a expressão "count" (contagem) é interpretada como 2.  O nome da variável de contagem (count) aparece ao lado do valor 2. A variável "count" está circulada, e há uma seta que aponta da variável para o valor 2. A seta é identificada com a frase

Para observar esse comportamento no Playground Kotlin, execute o programa na próxima seção.

Exemplo

  1. Abra o Playground Kotlin em um navegador da Web.
  2. Substitua o código no Playground Kotlin pelo programa abaixo.

Este programa cria uma variável com o nome count com um valor inicial de 2 e a usa mostrando o valor da variável count na saída. Não se preocupe se você ainda não entender todos os aspectos da sintaxe do código. Isso vai ser explicado em mais detalhes nas próximas seções.

fun main() {
    val count: Int = 2
    println(count)
}
  1. Execute o programa. A saída vai ser:
2

Declaração de variável

No programa executado, a segunda linha de código é:

val count: Int = 2

Essa instrução cria uma variável de número inteiro com o nome count que contém o número 2.

Há uma caixa com o nome "count" (contagem). Fora da caixa, há o rótulo "2". Há uma seta que aponta do valor para a caixa. Isso significa que o valor é armazenado na caixa.

Pode levar algum tempo para se familiarizar com a leitura da sintaxe (ou o formato) para declarar uma variável em Kotlin. O diagrama abaixo mostra onde cada detalhe sobre a variável precisa ficar, além da localização de espaços e símbolos.

O diagrama mostra a sintaxe para declarar uma variável em Kotlin. A declaração da variável começa com a palavra "val" seguida por um espaço. À direita, há uma caixa com o rótulo "name" (nome). Há um símbolo de dois-pontos à direita da caixa "name". Depois dos dois-pontos, há um espaço e uma caixa com o nome "data type" (tipo de dado). À direita dela, há um espaço, o símbolo de igual e depois outro espaço. À direita dessa caixa, há uma caixa com o nome "initial value" (valor inicial).

No contexto da variável de exemplo count, é possível ver que a declaração da variável começa com a palavra val. O nome da variável é count. O tipo de dado é Int, e o valor inicial é 2.

O diagrama mostra uma linha de código que diz: val count: Int = 2. Há setas apontando para partes do código e explicando o que elas são. Há um rótulo "name" (nome) que aponta para a palavra "count" (contagem) no código. Há um rótulo "data type" (tipo de dado) que aponta para a palavra Int no código. Há um rótulo "initial value" (valor inicial) que aponta para o número 2 no código.

Cada parte da declaração da variável é explicada em mais detalhes abaixo.

Palavra-chave para definir uma nova variável

Para definir uma nova variável, comece com a palavra-chave val do Kotlin, que significa valor. Isso informa ao compilador Kotlin que há uma declaração de variável na instrução.

Nome da variável

Assim como você nomeia uma função, também precisa dar um nome a uma variável. Na declaração da variável, o nome dela vem depois da palavra-chave val.

O diagrama mostra a sintaxe para declarar uma variável em Kotlin. A declaração da variável começa com a palavra "val" seguida por um espaço. À direita, há uma caixa com o rótulo "name" (nome). A caixa do nome é destacada com uma borda verde e um plano de fundo verde a fim de chamar a atenção para essa parte da declaração da variável. Há um símbolo de dois-pontos à direita da caixa "name". Depois dos dois-pontos, há um espaço e uma caixa com o nome "data type" (tipo de dado). À direita dela, há um espaço, o símbolo de igual e depois outro espaço. À direita dessa caixa, há uma caixa com o nome "initial value" (valor inicial).

Você pode escolher qualquer nome para a variável, mas não é permitido usar palavras-chave (link em inglês) do Kotlin.

Recomendamos escolher um nome que descreva os dados que a variável armazena para facilitar a leitura do código.

Os nomes das variáveis precisam seguir a convenção de concatenação, como você aprendeu com os nomes de funções. A primeira palavra do nome da variável começa com letra minúscula. Se houver várias palavras no nome, não pode haver espaço entre elas e todas as outras palavras precisam começar com letra maiúscula.

Exemplos de nomes de variáveis:

  • numberOfEmails
  • cityName
  • bookPublicationDate

No exemplo de código mostrado anteriormente, count é o nome da variável.

val count: Int = 2

Tipo de dado da variável

Após o nome da variável, você adiciona dois-pontos, um espaço e o tipo de dado da variável. Como mencionado anteriormente, String, Int, Double, Float, e Boolean são alguns dos tipos de dados básicos do Kotlin. Você vai aprender sobre outros tipos de dados mais adiante neste curso. Escreva os tipos de dados exatamente como aparecem e comece com uma letra maiúscula.

O diagrama mostra a sintaxe para declarar uma variável em Kotlin. A declaração da variável começa com a palavra "val" seguida por um espaço. À direita, há uma caixa com o rótulo "name" (nome). Há um símbolo de dois-pontos à direita da caixa "name". Depois dos dois-pontos, há um espaço e uma caixa com o nome "data type" (tipo de dado). A caixa de tipo de dado é destacada com uma borda verde e um plano de fundo verde a fim de chamar a atenção para essa parte da declaração da variável. À direita da caixa de tipo de dado, há um espaço, o sinal de igual e outro espaço. À direita dessa caixa, há uma caixa com o nome "initial value" (valor inicial).

Para o exemplo da variável count, Int é o tipo de dado da variável.

val count: Int = 2

Operador de atribuição

Na declaração da variável, o sinal de igual (=) vem após o tipo de dado. O sinal de igual é chamado de operador de atribuição. O operador de atribuição atribui um valor à variável. Em outras palavras, o valor ao lado direito do sinal de igual é armazenado na variável que está à esquerda do sinal.

O diagrama mostra a linha de código: val count: Int = 2. Há uma seta apontando do 2 (à direita do sinal de igual) para a palavra "count" (à esquerda do sinal de igual). Isso mostra que o valor 2 está sendo armazenado na variável count.

Valor inicial da variável

O valor da variável são os dados armazenados nela.

O diagrama mostra a sintaxe para declarar uma variável em Kotlin. A declaração da variável começa com a palavra "val" seguida por um espaço. À direita, há uma caixa com o rótulo "name" (nome). Há um símbolo de dois-pontos à direita da caixa "name". Depois dos dois-pontos, há um espaço e uma caixa com o nome "data type" (tipo de dado). À direita da caixa de tipo de dado, há um espaço, o sinal de igual e outro espaço. À direita dessa caixa, há uma caixa com o nome "initial value" (valor inicial). A caixa do valor inicial é destacada com uma borda verde e um plano de fundo verde a fim de chamar a atenção para essa parte da declaração da variável.

Para o exemplo de variável count, o número 2 é o valor inicial dela.

val count: Int = 2

Talvez você também ouça a frase: "a variável count é inicializada como 2". Isso significa que 2 é o primeiro valor armazenado na variável quando ela é declarada.

O valor inicial vai ser diferente dependendo do tipo de dado declarado para a variável.

Consulte a tabela abaixo, que você pode reconhecer porque já apareceu antes no codelab. A terceira coluna mostra exemplos de valores que podem ser armazenados em uma variável de cada tipo correspondente. Esses valores são chamados de literais porque são fixos ou constantes (em que os valores são constantemente os mesmos). Como exemplo, o número inteiro 32 sempre vai ter o valor de 32. Por outro lado, uma variável não é um literal, porque o valor dela pode mudar. Você pode ouvir esses valores literais sendo chamados com base no tipo: literal de string, literal de inteiro, literal booleano etc.

Tipo de dado de Kotlin

Qual dado pode conter

Exemplos de valores literais

String

Texto

"Add contact"
"Search"
"Sign in"

Int

Número inteiro

32
1293490
-59281

Double

Número decimal

2.0
501.0292
-31723.99999

Float

Número decimal, que é menos preciso que um Double e tem f ou F no fim do número.

5.0f
-1630.209f
1.2940278F

Boolean

true ou false. Use esse tipo de dado quando houver apenas dois valores possíveis. true e false são palavras-chave em Kotlin.

true
false

É importante fornecer um valor apropriado e válido de acordo com o tipo de dado da variável. Por exemplo, não é possível armazenar um literal de string, como "Hello", em uma variável do tipo Int porque o compilador Kotlin vai gerar um erro.

Usar uma variável

Veja abaixo o programa original que você executou no Playground Kotlin. Até agora, você aprendeu que a segunda linha de código cria uma nova variável de número inteiro com o nome count e o valor 2.

fun main() {
    val count: Int = 2
    println(count)
}

Agora, observe a terceira linha de código. Você está exibindo a variável count na saída:

println(count)

Não há aspas ao redor da palavra count. Esse é um nome de variável, não um literal de string. Haveria aspas ao redor da palavra se ela fosse um literal de string. Quando você executa o programa, o compilador Kotlin interpreta a expressão dentro dos parênteses, que é count, para a instrução println(). Como a expressão é interpretada como 2, o método println() é chamado com 2 como entrada: println(2).

Portanto, a saída do programa é:

2

Só o número na saída não é muito útil. Seria mais útil ter uma mensagem mais detalhada na saída para explicar o que o 2 representa.

Modelo de string

Uma mensagem mais útil para mostrar na saída é:

You have 2 unread messages.

Siga estas etapas para que o programa gere uma mensagem mais útil.

  1. Atualize o programa no Playground Kotlin com o código abaixo. Para a chamada println(), transmita um literal de string que contenha o nome da variável count. Coloque o texto entre aspas. Isso ainda não vai fornecer os resultados esperados. Você vai corrigir esse problema em uma etapa futura.
fun main() {
    val count: Int = 2
    println("You have count unread messages.")
}
  1. Execute o programa, e a saída vai ser:
You have count unread messages.

Essa frase não faz sentido! Você quer que o valor da variável count seja mostrado na mensagem, e não o nome dela.

  1. Para corrigir a saída, você precisa de um modelo de string. Este é um modelo de string porque ele contém uma expressão de modelo, que é um cifrão ($) seguido do nome de uma variável. Uma expressão de modelo é avaliada e o valor dela é substituído na string.

String usando um modelo

Adicione um cifrão $ antes da variável count. Nesse caso, a expressão de modelo $count é interpretada como 2, e o número 2 é substituído na string em que a expressão estava.

fun main() {
    val count: Int = 2
    println("You have $count unread messages.")
}
  1. Ao executar o programa, a saída vai ser o esperado:
You have 2 unread messages.

Essa frase faz muito mais sentido para o usuário.

  1. Agora, mude o valor inicial da variável count para outro literal de inteiro. Por exemplo, você pode escolher o número 10. Não mude o restante do código no programa.
fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}
  1. Execute o programa. Observe que a saída mudou de forma adequada e que você não precisou mudar a instrução println() no programa.
You have 10 unread messages.

Agora, você consegue ver a utilidade de um modelo de string. Você só escreveu o modelo de string uma vez no código ("You have $count unread messages."). Se você mudar o valor inicial da variável count, a instrução println() vai continuar funcionando. O código está mais flexível agora.

Para enfatizar ainda mais esse ponto, compare os dois programas abaixo. O primeiro usa um literal de string, com o número exato de mensagens não lidas diretamente na string. Ele só funciona quando o usuário tem 10 mensagens não lidas.

fun main() {
    println("You have 10 unread messages.")
}

Ao usar uma variável e um modelo de string neste segundo programa, o código pode se adaptar a mais situações. O segundo programa é mais flexível.

fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}

Inferência de tipo

Veja uma dica para escrever menos código ao declarar variáveis.

Inferência de tipo é quando o compilador Kotlin pode inferir (ou determinar) qual tipo de dado uma variável precisa ser, sem que o tipo esteja escrito explicitamente no código. Isso significa que você pode omitir o tipo de dado em uma declaração de variável se fornecer um valor inicial a ela. O compilador Kotlin analisa o tipo de dado do valor inicial e supõe que você quer que a variável contenha dados desse tipo.

A sintaxe abaixo é de uma declaração de variável que usa a inferência de tipo:

O diagrama mostra a sintaxe para declarar uma variável em Kotlin usando a inferência de tipo. A declaração da variável começa com a palavra "val" seguida por um espaço. À direita, há uma caixa com o rótulo "name" (nome). À direita da caixa "name", há um espaço, o sinal de igual e outro espaço. À direita dessa caixa, há uma caixa com o nome "initial value" (valor inicial).

Voltando ao exemplo de count, o programa inicialmente continha esta linha de código:

val count: Int = 2

No entanto, essa linha de código também pode ser escrita da maneira abaixo. O símbolo de dois-pontos (:) e o tipo de dados Int são omitidos. Você precisa digitar menos palavras na sintaxe atualizada e alcança o mesmo resultado da criação de uma variável Int com o nome count e o valor 2.

val count = 2

O compilador Kotlin sabe que você quer armazenar 2 (um número inteiro) na variável count. Então, ele pode inferir que a variável count é do tipo Int. Bem útil, não é? Esse é um exemplo de como criar código Kotlin é mais conciso.

Mesmo que o exemplo seja apenas sobre uma variável do tipo Int, o conceito de inferência de tipo se aplica a todos os tipos de dados no Kotlin.

Operações matemáticas básicas com números inteiros

Qual é a diferença entre uma variável Int com o valor 2 e uma variável String com o valor "2"? Quando ambas são mostradas na saída, elas parecem iguais.

A vantagem de armazenar números inteiros como um valor Int (e não como uma String) é que você pode executar operações matemáticas com variáveis Int, como adição, subtração, divisão e multiplicação (veja outros operadores). Por exemplo, duas variáveis de número inteiro podem ser adicionadas para se chegar à soma delas. Em alguns casos, é razoável ter números inteiros armazenados como strings, mas o objetivo desta seção é mostrar o que é possível fazer com as variáveis Int.

  1. Volte ao Playground Kotlin e remova tudo que estiver escrito no editor de código.
  2. Crie um novo programa em que você define uma variável de número inteiro para o número de e-mails não lidos em uma caixa de entrada e a inicialize com um valor como 5. Você pode escolher outro número, se quiser. Defina uma segunda variável de número inteiro para o número de e-mails lidos em uma caixa de entrada. Comece com um valor como 100. Você pode escolher outro número, se quiser. Mostre o número total de mensagens na caixa de entrada somando os dois números inteiros.
fun main() {
    val unreadCount = 5
    val readCount = 100
    println("You have ${unreadCount + readCount} total messages in your inbox.")
}
  1. Execute o programa. Ele vai mostrar o número total de mensagens na caixa de entrada:
You have 105 total messages in your inbox.

Para um modelo de string, você aprendeu que pode colocar o símbolo $ antes de um nome de variável. No entanto, se você tiver uma expressão mais complexa, vai precisar colocar a expressão entre chaves, com o símbolo $ antes delas: ${unreadCount + readCount}. A expressão entre chaves, unreadCount + readCount, é interpretada como 105. Em seguida, o valor 105 é substituído no literal de string.

O diagrama mostra uma expressão ao lado do valor dela. Há um rótulo de expressão e abaixo dele está escrito: unreadCount + readCount. À direita desse item, há o rótulo "value" (valor) e, abaixo dele, o valor 105.

  1. Para ver mais detalhes sobre esse assunto, crie variáveis com diferentes nomes e valores iniciais e use expressões de modelo para mostrar mensagens na saída.

Por exemplo, modifique o programa para que mostre isto:

100 photos
10 photos deleted
90 photos left

Veja uma forma de criar o programa, embora existam outras maneiras que também funcionam.

fun main() {
    val numberOfPhotos = 100
    val photosDeleted = 10
    println("$numberOfPhotos photos")
    println("$photosDeleted photos deleted")
    println("${numberOfPhotos - photosDeleted} photos left")
}

4. Atualizar variáveis

Quando um app está em execução, pode ser necessário atualizar o valor de uma variável. Por exemplo, em um app de compras, à medida que o usuário adiciona itens ao carrinho de compras, o valor total aumenta.

Vamos simplificar o caso de uso de compras em um programa simples. A lógica está escrita abaixo com linguagem humana, não em Kotlin. Isso é chamado de pseudocódigo, porque descreve os pontos principais de como o código vai ser criado, mas não contém todos os detalhes.

Na função principal de um programa:

  • Crie uma variável cartTotal (total no carrinho) de número inteiro que comece com o valor 0.
  • O usuário adiciona um moletom que custa R$ 20 ao carrinho de compras.
  • Atualize a variável cartTotal para 20, que é o custo atual dos itens no carrinho de compras.
  • Exiba o custo total dos itens no carrinho, que é a variável cartTotal, na saída.

Para simplificar ainda mais, não é necessário criar um código para quando o usuário adicionar itens ao carrinho de compras. Você ainda não aprendeu como um programa pode responder à entrada do usuário. Isso vai ser abordado em uma unidade futura. Portanto, concentre-se nas partes em que você cria, atualiza e mostra a variável cartTotal.

  1. Substitua o código existente no Playground Kotlin pelo programa abaixo. Na linha 2, você inicializa a variável cartTotal como o valor 0. Como o valor inicial é indicado, não é necessário especificar o tipo de dado Int devido à inferência de tipo. Na linha 3 do programa, você tenta atualizar a variável cartTotal para 20 com o operador de atribuição (=). Na linha 4, você exibe a variável cartTotal usando um modelo de string.
fun main() {
    val cartTotal = 0
    cartTotal = 20
    println("Total: $cartTotal")
}
  1. Execute o programa. Você vai ver um erro de compilação.
  2. O erro diz que não é possível reatribuir a val. O erro está na terceira linha do programa, que tenta mudar o valor da variável cartTotal para 20. A val cartTotal não pode ser reatribuída a outro valor (20) depois de receber um valor inicial (0).
Val cannot be reassigned

Se você precisar atualizar o valor, declare a variável com a palavra-chave do Kotlin var, em vez de val.

  • Palavra-chave val: use quando o valor da variável não muda.
  • Palavra-chave var: use quando o valor da variável pode mudar.

Com val, a variável é somente leitura, o que significa que você só pode ler ou acessar o valor dela. Depois que o valor é definido, não é possível o editar ou modificar. Com var, a variável é mutável, o que significa que o valor pode mudar ou ser modificado. O valor pode ser transformado.

Para se lembrar da diferença, considere val um valor fixo e var uma variável. Em Kotlin, é recomendável usar a palavra-chave val em vez de var sempre que possível.

  1. Atualize a declaração da variável cartTotal na segunda linha do programa para que use var em vez de val. O código vai ficar assim:
fun main() {
    var cartTotal = 0
    cartTotal = 20
    println("Total: $cartTotal")
}
  1. Observe a sintaxe do código na terceira linha do programa que atualiza a variável.
cartTotal = 20

Use o operador de atribuição (=) para atribuir um novo valor (20) à variável existente (cartTotal). Não é necessário usar a palavra-chave var de novo, porque a variável já está definida.

O diagrama mostra uma linha de código que diz: cartTotal = 20. Há uma seta apontando do 20, à direita do sinal de igual, para a palavra "cartTotal" (total do carrinho), à esquerda do sinal de igual. Isso mostra que o valor 20 está sendo armazenado na variável "cartTotal".

Usando a analogia da caixa, imagine o valor 20 sendo armazenado na caixa cartTotal.

Há uma caixa em que está escrito "cartTotal" (total do carrinho). Fora da caixa, há o rótulo 20. Há uma seta que aponta do valor para a caixa. Isso significa que o valor é armazenado na caixa.

Veja um diagrama da sintaxe geral para atualizar uma variável que já foi declarada em uma linha de código anterior. Inicie a instrução com o nome da variável que você quer atualizar. Adicione um espaço, o sinal de igual e outro espaço. Em seguida, escreva o valor atualizado da variável.

O diagrama mostra a sintaxe para atualizar uma variável em Kotlin. A linha de código começa com uma caixa "name" (nome). À direita da caixa "name", há um espaço, o sinal de igual e outro espaço. À direita desse espaço, há uma caixa com o rótulo "update value" (valor atualizado).

  1. Execute o programa. O código será compilado corretamente. A saída vai ficar assim:
Total: 20
  1. Para ver como o valor da variável muda durante a execução do programa, mostre a variável cartTotal na saída depois de declarar a variável no início. Veja as mudanças no código abaixo. A terceira linha tem uma nova instrução println(). Há também uma linha em branco que foi adicionada à quarta linha do código. As linhas em branco não afetam a forma como o compilador entende o código. Adicione uma linha em branco para facilitar a leitura do código, separando os blocos relacionados.
fun main() {
    var cartTotal = 0
    println("Total: $cartTotal")

    cartTotal = 20
    println("Total: $cartTotal")
}
  1. Execute o programa novamente. A saída vai ser:
Total: 0
Total: 20

É possível ver que, inicialmente, o total do carrinho de compras é 0. Em seguida, ele é atualizado para 20. A variável foi atualizada. Isso foi possível porque você mudou o cartTotal, que era uma variável somente leitura (val), para uma variável mutável (var).

Lembre-se de usar var apenas para declarar uma variável cujo valor muda. Caso contrário, use val para declarar variáveis cujo valor não muda. Essa prática torna o código mais seguro. O uso de val garante que as variáveis não vão ser atualizadas no programa se você não quiser que isso aconteça. Depois que uma val recebe um valor, ela continua sempre com esse valor.

Operadores de incremento e decremento

Agora você sabe que uma variável precisa ser declarada como var para poder atualizar o valor dela. Aplique esse conhecimento ao exemplo de mensagem de e-mail abaixo, que já deve reconhecer.

  1. Substitua o código no Playground Kotlin por este programa:
fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}
  1. Execute o programa. A saída vai ser:
You have 10 unread messages.
  1. Substitua a palavra-chave val pela var para tornar a variável count mutável. Não vai haver nenhuma mudança na saída quando você executar o programa.
fun main() {
    var count: Int = 10
    println("You have $count unread messages.")
}
  1. No entanto, agora você pode atualizar a variável count para outro valor. Por exemplo, quando um novo e-mail chegar à caixa de entrada do usuário, você vai poder aumentar a count em 1. Não é preciso criar um código para a chegada de um e-mail. O recebimento de dados da Internet é um tópico mais avançado, que vai ser abordado em uma unidade futura. Por enquanto, concentre-se na variável count e a aumente em 1 com esta linha de código:
count = count + 1

A expressão à direita do sinal de igual é count + 1 e é interpretada como 11. Isso ocorre porque o valor atual de count é 10 (que está definido na segunda linha do programa) e 10 + 1 é igual a 11. Em seguida, com o operador de atribuição, o valor 11 é atribuído ou armazenado na variável count.

O diagrama mostra uma linha de código que diz: count = count + 1. Há um círculo ao redor da expressão "count + 1". Há uma seta apontando da expressão circulada (à direita do sinal de igual) para a palavra "count" (à esquerda do sinal de igual). Isso mostra que o valor da expressão "count + 1" está sendo armazenado na variável "count".

Adicione esta linha de código ao programa na parte de baixo da função main(). O código vai ficar assim:

fun main() {
    var count = 10
    println("You have $count unread messages.")
    count = count + 1
}

Se você executar o programa agora, a saída vai ser a mesma de antes, porque você não adicionou nenhum código para usar a variável count depois de a atualizar.

  1. Adicione outra instrução para mostrar o número de mensagens não lidas depois que a variável for atualizada.
fun main() {
    var count = 10
    println("You have $count unread messages.")
    count = count + 1
    println("You have $count unread messages.")
}
  1. Execute o programa. A segunda mensagem vai mostrar a count atualizada de 11 mensagens.
You have 10 unread messages.
You have 11 unread messages.
  1. Uma forma encurtada de aumentar uma variável em 1 é usar o operador de incremento (++), composto por dois símbolos de adição. Ao usar esses símbolos diretamente após o nome de uma variável, você informa ao compilador que quer adicionar 1 ao valor atual da variável e depois armazenar o novo valor nela. As duas linhas de código abaixo são equivalentes, mas o uso do operador de incremento ++ exige menos digitação.
count = count + 1
count++

Faça esta modificação no código e execute o programa. Não pode haver espaços entre o nome da variável e o operador de incremento.

fun main() {
    var count = 10
    println("You have $count unread messages.")
    count++
    println("You have $count unread messages.")
}
  1. Execute o programa. A saída é a mesma, mas agora você aprendeu sobre um novo operador.
You have 10 unread messages.
You have 11 unread messages.
  1. Agora, modifique a linha 4 do programa para usar o operador de decremento (--) após o nome da variável count. O operador de decremento é composto por dois símbolos de subtração. Ao colocar o operador de decremento após o nome da variável, você informa ao compilador que quer diminuir o valor da variável em 1 e armazenar o novo valor nela.
fun main() {
    var count = 10
    println("You have $count unread messages.")
    count--
    println("You have $count unread messages.")
}
  1. Execute o programa. A saída vai ficar assim:
You have 10 unread messages.
You have 9 unread messages.

Nesta seção, você aprendeu a atualizar uma variável mutável usando o operador de incremento (++) e o de decremento (--). Mais especificamente, count++ é o mesmo que count = count + 1 e count-- é o mesmo que count = count - 1.

5. Outros tipos de dados

Anteriormente no codelab, apresentamos alguns tipos de dados básicos comuns: String, Int, Double e Boolean. Você acabou de usar o tipo de dado Int. Agora vamos abordar os outros tipos.

Tipo de dado de Kotlin

Qual dado pode conter

String

Texto

Int

Número inteiro

Double

Número decimal

Boolean

true ou false (apenas dois valores possíveis)

Teste os programas abaixo no Playground Kotlin para ver a saída.

Double

Quando precisar de uma variável com um valor decimal, use o tipo Double. Para conferir o intervalo válido dessa variável, consulte esta tabela (link em inglês) e os exemplos dos dígitos decimais que ela pode armazenar.

Imagine que você está indo a algum lugar e que a viagem é dividida em três partes, porque é preciso fazer paradas ao longo do caminho. Este programa mostra a distância total que falta para chegar ao destino.

  1. Digite o código abaixo no Playground Kotlin. Você entende o que está acontecendo em cada linha de código?
fun main() {
    val trip1: Double = 3.20
    val trip2: Double = 4.10
    val trip3: Double = 1.72
    val totalTripLength: Double = 0.0
    println("$totalTripLength miles left to destination")
}

Três variáveis com os nomes trip1, trip2 e trip3 são declaradas para representar a distância de cada parte da viagem. Todas elas são variáveis Double, porque armazenam valores decimais. Use val para declarar cada variável, porque os valores delas não mudam ao longo do programa. O programa também cria uma quarta variável, com o nome totalTripLength (tempo total da viagem), cujo valor inicial agora é 0.0. A última linha do programa mostra uma mensagem com o valor da variável totalTripLength.

  1. Corrija o código para que a variável totalTripLength seja a soma das três durações da viagem.
val totalTripLength: Double = trip1 + trip2 + trip3

A expressão à direita do sinal de igual é interpretada como 9.02 porque 3.20 + 4.10 + 1.72 é igual a 9.02. O valor 9.02 é armazenado na variável totalTripLength.

O diagrama mostra uma linha de código que diz: val totalTripLength: Double = trip1 + trip2 + trip3. Há um círculo ao redor da expressão trip1 + trip2 + trip3. Há uma seta apontando da expressão circulada, à direita do sinal de igual, para a palavra "totalTripLength" (tempo total da viagem), à esquerda do sinal de igual. Isso mostra que o valor da expressão trip1 + trip2 + trip3 está sendo armazenado na variável totalTripLength.

O programa vai ficar parecido com o código abaixo:

fun main() {
    val trip1: Double = 3.20
    val trip2: Double = 4.10
    val trip3: Double = 1.72
    val totalTripLength: Double = trip1 + trip2 + trip3
    println("$totalTripLength miles left to destination")
}
  1. Execute o programa. O resultado vai ser:
9.02 miles left to destination
  1. Atualize o código para remover o tipo de dado Double das declarações da variável, porque ele é desnecessário devido à inferência de tipo. O compilador Kotlin pode inferir que essas variáveis são do tipo de dado Double com base nos números decimais fornecidos como valores iniciais.
fun main() {
    val trip1 = 3.20
    val trip2 = 4.10
    val trip3 = 1.72
    val totalTripLength = trip1 + trip2 + trip3
    println("$totalTripLength miles left to destination")
}
  1. Execute o código novamente para conferir se ele ainda é compilado. A saída vai ser a mesma, mas agora o código está mais simples.

String

Quando você precisar de uma variável que armazene texto, use uma String. Coloque aspas em torno dos valores literais da string, como em "Hello Kotlin". Não é preciso colocar os valores literais das variáveis Int e Double entre aspas.

  1. Copie e cole este programa no Playground Kotlin.
fun main() {
    val nextMeeting = "Next meeting:"
    val date = "January 1"
    val reminder = nextMeeting + date
    println(reminder)
}

Há duas variáveis String declaradas, uma nextMeeting (próxima reunião) e a outra date (data). Em seguida, uma terceira variável String é declarada com o nome reminder (lembrete). Ela é definida como sendo igual à variável nextMeeting mais a date.

Com o símbolo "+", você pode juntar duas strings, o que é chamado de concatenação. As duas strings são combinadas, uma após a outra. O resultado da expressão nextMeeting + date é "Next meeting:January 1" (A próxima reunião é em: 1º de janeiro), como mostrado no diagrama abaixo.

Duas variáveis sendo concatenadas

O valor "Next meeting:January 1" é armazenado na variável reminder usando o operador de atribuição da linha 4 do programa.

  1. Execute o programa. O resultado vai ser:
Next meeting:January 1

Quando você concatena duas strings, não são adicionados espaços entre elas. Se você quiser que haja um espaço após os dois-pontos na string resultante, é preciso adicionar o espaço a uma das strings.

  1. Atualize a variável nextMeeting para que tenha um espaço a mais no fim da string, antes das aspas de fechamento. Como alternativa, também é possível adicionar um espaço ao início da variável date. O programa vai ficar assim:
fun main() {
    val nextMeeting = "Next meeting: "
    val date = "January 1"
    val reminder = nextMeeting + date
    println(reminder)
}
  1. Execute o programa novamente. Agora haverá um espaço após os dois-pontos na mensagem de saída.
Next meeting: January 1
  1. Modifique o código para concatenar ou adicionar outro texto à expressão, que é armazenada na variável reminder.

Use o símbolo + para adicionar o literal de string " at work" (no trabalho) ao final da string reminder.

  1. Execute o programa.

A saída vai ficar assim:

Next meeting: January 1 at work

O código abaixo mostra uma maneira de implementar o comportamento.

fun main() {
    val nextMeeting = "Next meeting: "
    val date = "January 1"
    val reminder = nextMeeting + date + " at work"
    println(reminder)
}

Não há aspas entre nextMeeting e date porque esses são nomes de variáveis de string existentes em que os respectivos valores são texto entre aspas. Por outro lado, o literal " at work" não foi definido anteriormente em nenhuma variável. Portanto, use aspas ao redor desse texto para que o compilador saiba que essa é uma string que precisa ser concatenada com as outras.

Tecnicamente, é possível conseguir a mesma saída declarando uma variável String com todo o texto, em vez de usar variáveis separadas. No entanto, o objetivo deste exercício é demonstrar como declarar e manipular variáveis String e principalmente como concatenar strings separadas.

  1. Ao ler códigos que contêm strings, você pode encontrar sequências de escape. Elas são caracteres precedidos por um símbolo de barra invertida (\), também chamado de barra invertida de escape.

Veja o exemplo \" em um literal de string, como mostrado abaixo. Copie e cole este código no Playground Kotlin.

fun main() {
    println("Say \"hello\"")
}

Você aprendeu anteriormente a usar uma string literal entre aspas duplas. Mas e se você quiser usar o símbolo " na string? Para isso, é necessário adicionar o símbolo de barra invertida antes das aspas duplas na string, desta forma: \". Não se esqueça que a string inteira ainda precisa estar entre aspas duplas.

  1. Execute o programa para conferir a saída. Ela vai ser:
Say "hello"

Na saída, hello está entre aspas porque adicionamos \" antes e depois de hello na instrução println().

Para conferir outras sequências de escape com suporte no Kotlin, consulte a página de documentação sobre sequências de escape (link em inglês). Por exemplo, se você quiser uma nova linha na string, use o símbolo \ antes do caractere n, como em \n.

Você aprendeu sobre concatenação de strings e também sobre sequências de escape em strings. Vamos ver o último tipo de dado abordado neste codelab.

Booleano

O tipo de dado Boolean é útil quando a variável tem apenas dois valores possíveis, representados por true ou false.

Um exemplo é uma variável que representa se o modo avião de um dispositivo está ativado ou desativado ou se as notificações de um app estão ativadas ou não.

  1. Digite o código abaixo no Playground Kotlin. Na linha 2 do programa, declare uma variável Boolean com o nome notificationsEnabled (notificações ativadas) e dê a ela o valor inicial de true. Tecnicamente, é possível omitir : Boolean na declaração. Você pode o remover, se quiser. A terceira linha do programa mostra o valor da variável notificationsEnabled.
fun main() {
    val notificationsEnabled: Boolean = true
    println(notificationsEnabled)
}

Execute o programa. A saída vai ser assim:

true
  1. Mude o valor inicial da variável Boolean para "false" na segunda linha do programa.
fun main() {
    val notificationsEnabled: Boolean = false
    println(notificationsEnabled)
}

Execute o programa. A saída vai ser assim:

false
  1. Outros tipos de dados podem ser concatenados em Strings. Por exemplo, você pode concatenar valores Booleans com Strings. Use o símbolo + para concatenar (ou anexar) o valor da variável booleana notificationsEnabled ao final da string "Are notifications enabled? " (as notificações estão ativadas?).
fun main() {
    val notificationsEnabled: Boolean = false
    println("Are notifications enabled? " + notificationsEnabled)
}

Execute o programa para ver o resultado da concatenação. A saída do programa vai ser esta:

Are notifications enabled? false

Observe que é possível definir a variável Boolean como um valor true ou false. Com as variáveis Boolean, você pode codificar cenários mais interessantes, em que um conjunto de instruções é executado quando uma variável Boolean tiver o valor true. Ou seja, se a variável Boolean tiver um valor "false", as instruções vão ser ignoradas. Você vai aprender mais sobre variáveis Booleans em um próximo codelab.

6. Convenções de programação

No codelab anterior, apresentamos o guia de estilo do Kotlin para criar códigos Android de maneira consistente, conforme recomendado pelo Google e seguido por outros desenvolvedores profissionais.

Veja algumas outras convenções de formatação e programação que você pode seguir, com base nos novos tópicos que aprendeu:

  • Os nomes das variáveis precisam seguir as regras de letras concatenadas e começar com uma letra minúscula.
  • Em uma declaração de variável, precisa haver um espaço após os dois-pontos ao especificar o tipo de dado.

O diagrama mostra uma linha de código que diz: val discount: Double = .20. Há uma seta apontando para o espaço entre o símbolo de dois-pontos e o tipo de dado Double, com um rótulo que diz "space" (espaço).

  • Precisa haver um espaço antes e depois de um operador, como o de atribuição (=), adição (+), subtração (-), multiplicação (*) e divisão (/), entre outros.

Esse diagrama mostra uma linha de código que diz: var pet =

O diagrama mostra uma linha de código que diz: val sum = 1 + 2. Há setas apontando para o espaço antes e depois do símbolo de adição, com o rótulo "space" (espaço).

  • Conforme você cria programas mais complexos, há um limite recomendado de 100 caracteres por linha. Isso garante que você possa ler todo o código de um programa na tela do computador com facilidade, sem precisar rolar a página horizontalmente.

7. Comentários no código

Ao programar, outra boa prática é adicionar comentários que descrevam o que o código pretende fazer. Os comentários podem ajudar as pessoas que lerem o código a segui-lo com mais facilidade. Dois símbolos de barras, ou //, indicam que o texto depois delas no restante da linha é considerado um comentário. Por isso, ele não é interpretado como código. É comum adicionar um espaço após os dois símbolos de barras.

// This is a comment.

Um comentário também pode começar no meio de uma linha de código. No exemplo abaixo, height = 1 é uma instrução de programação normal. // Assume the height is 1 to start with é interpretado como um comentário e não é considerado parte do código.

height = 1 // Assume the height is 1 to start with

Se você quiser descrever o código com mais detalhes e o comentário ultrapassar 100 caracteres em uma linha, use um comentário de várias linhas. Inicie o comentário de várias linhas com uma barra (/) e um símbolo de asterisco (*), como /*. Adicione um asterisco ao início de cada nova linha do comentário. Por fim, termine o comentário com um asterisco e um símbolo de barra */.

/*
 * This is a very long comment that can
 * take up multiple lines.
 */

Este programa contém comentários de uma e de várias linhas que descrevem o que está acontecendo:

/*
 * This program displays the number of messages
 * in the user's inbox.
 */
fun main() {
    // Create a variable for the number of unread messages.
    var count = 10
    println("You have $count unread messages.")

    // Decrease the number of messages by 1.
    count--
    println("You have $count unread messages.")
}

Como mencionado anteriormente, é possível adicionar linhas vazias em branco ao código para agrupar instruções relacionadas e facilitar a leitura do código.

  1. Adicione alguns comentários a um snippet de código anterior que você usou.
  2. Execute o programa para garantir que o comportamento não mudou, porque os comentários não devem afetar a saída.

8. Conclusão

Ótimo trabalho! Você aprendeu sobre as variáveis em Kotlin, por que elas são úteis na programação e como as criar, atualizar e usar. Você testou diferentes tipos de dados básicos em Kotlin, incluindo os tipos Int, Double, String e Boolean. Também aprendeu sobre a diferença entre as palavras-chave val e var.

Todos esses conceitos são fundamentais na sua jornada para se tornar desenvolvedor.

Esperamos você no próximo codelab.

Resumo

  • Uma variável é um contêiner de um único dado.
  • É necessário declarar uma variável antes de a usar.
  • Use a palavra-chave val para definir uma variável somente leitura em que o valor não pode mudar depois de ser atribuído.
  • Use a palavra-chave var para definir uma variável que é mutável, ou seja, pode mudar.
  • Em Kotlin, é preferível usar val em vez de var sempre que possível.
  • Para declarar uma variável, comece com a palavra-chave val ou var. Em seguida, especifique o nome da variável, o tipo de dado e o valor inicial. Por exemplo: val count: Int = 2.
  • Com a inferência de tipo, você pode omitir o tipo de dado na declaração da variável caso um valor inicial seja fornecido.
  • Alguns tipos de dados básicos do Kotlin comuns são: Int, String, Boolean, Float e Double.
  • Use o operador de atribuição (=) para atribuir um valor a uma variável durante a declaração dela ou ao atualizar a variável.
  • Só é possível atualizar uma variável que foi declarada como mutável (com var).
  • Use o operador de incremento (++) ou decremento (--) para aumentar ou diminuir o valor de uma variável de número inteiro em 1, respectivamente.
  • Use o símbolo + para concatenar strings. Também é possível concatenar variáveis de outros tipos de dados, por exemplo, Int e Boolean, como Strings.

Saiba mais