O que é a linguagem em Kotlin? Em resumo Kotlin é uma linguagem de programação amplamente usada por desenvolvedores Android em todos os lugares. Este tópico serve como um curso intensivo em Kotlin para você começar rapidamente.

Declaração de variável

Kotlin usa duas palavras-chave diferentes para declarar variáveis: val e var.

Use val para variáveis ​​cujo valor nunca muda.
Use var para variáveis ​​cujo valor pode mudar.

Assim como em outros idiomas, você também pode usar Byte, Short, Long, Float e Double dependendo de seus dados numéricos.

A palavra-chave var significa que a contagem pode ser reatribuída conforme necessário.

No entanto, alguns valores não podem ser alterados. Portanto, considere uma string chamada languageName. Se você quiser garantir que languageName sempre tenha o valor “Kotlin”, você pode declarar languageName com a palavra-chave val.

Além disso, essas palavras-chave permitem que você indique claramente o que pode ser alterado. Use-os conforme necessário. Se uma referência de variável precisar ser reatribuída, declare-a como var. Caso contrário, use val.

Tipo de inferência

Continuando com o exemplo anterior, quando você atribui um valor inicial a languageName , o compilador Kotlin pode inferir o tipo com base no tipo do valor atribuído.

Por exemplo, como o valor de “Kotlin” é do tipo String, o compilador infere que languageName também é uma String. Kotlin é uma linguagem estática. Isso significa que os tipos são resolvidos em tempo de compilação e nunca mudam.

No exemplo a seguir, languageName é inferido como String.

toUpperCase() é uma função que só pode ser chamada em variáveis ​​do tipo String. Como o compilador Kotlin infere languageName como uma string, você pode chamar toUpperCase() com segurança. No entanto, inc() é uma função do operador Int, portanto, não pode ser chamada em String. O método de inferência de tipo do Kotlin fornece brevidade e segurança de tipo.

Segurança zero

Em suma, em algumas linguagens, é possível declarar uma variável de tipo de referência sem fornecer um valor inicial explícito. Nesses casos, as variáveis ​​geralmente contêm valores nulos. Ou seja, por padrão, as variáveis ​​Kotlin não podem conter valores nulos. Isso significa que o trecho de código a seguir não é válido.

Para que uma variável mantenha um valor nulo, ela deve ser de um tipo que permite valor nulo. Você pode designar uma variável como anulável usando o sufixo de tipo com ?, conforme mostrado no exemplo a seguir.

Com um tipo String?, você pode atribuir um valor String ou null a languageName.

Você precisa ter cuidado com variáveis ​​anuláveis, caso contrário você pode encontrar um NullPointerException. Por exemplo, em Java, se você tentar chamar um método em um valor nulo, seu programa falhará.

Kotlin fornece muitos mecanismos para lidar com variáveis ​​anuláveis ​​com segurança. Para obter mais informações, consulte Padrões Kotlin comuns no Android: substituições.

Condicional

Kotlin tem vários mecanismos para implementar a lógica condicional. A mais comum delas é a instrução if-else. Se a expressão entre parênteses ao lado da palavra-chave if for avaliada como verdadeira, o código nessa ramificação (ou seja, o código imediatamente após entre chaves) será executado. Caso contrário, o código dentro da ramificação else será executado.

Você pode usar else if para expressar várias condições. Isso permite que você expresse uma lógica mais refinada e complexa em uma única instrução condicional, como no exemplo a seguir:

As instruções condicionais são úteis para expressar lógica com estado, mas você pode se repetir ao escrevê-las. No exemplo acima, você apenas imprime uma string em cada branch. Para evitar essa duplicação, o Kotlin fornece expressões condicionais. O último exemplo pode ser reescrito da seguinte forma:

Implicitamente, cada ramificação condicional retorna o resultado da expressão na última linha, portanto, você não precisa usar a palavra-chave return. Como o resultado das três ramificações é do tipo String, o resultado da expressão if-else também é do tipo String. Neste exemplo, answerString obtém o valor inicial do resultado da expressão if-else. A inferência de tipo pode ser usada para omitir uma declaração de tipo explícita para answerString , mas geralmente é melhor incluí-la para maior clareza.

Complexidade

Devido à crescente complexidade das instruções condicionais, é recomendável substituir as expressões if-else por expressões when, conforme mostrado no exemplo a seguir:

Cada ramificação em uma expressão when é representada por uma condição, uma seta (->) e um resultado. Retorna o resultado da expressão à direita se a condição à esquerda da seta for verdadeira. Observe que a execução não se move de uma ramificação para a próxima. O código no exemplo da expressão when é funcionalmente idêntico ao exemplo anterior, mas mais fácil de ler.

As condicionais do Kotlin destacam um dos recursos de última geração, as transferências inteligentes. Em vez de usar o operador safe-call ou o operador not-null-declaration para manipular valores anuláveis, você pode usar uma instrução condicional para verificar se uma variável contém uma referência a um valor nulo, como no exemplo a seguir:

Em ramificações condicionais, languageName pode ser tratado como não anulável. Kotlin é inteligente o suficiente para reconhecer que a condição para executar uma ramificação é que languageName não contenha um valor nulo. Portanto, você não precisa tratar languageName como anulável neste branch. Essa transferência inteligente funciona para verificação de nulos, verificação de tipo ou qualquer outra coisa que satisfaça o contrato.

Função

Você pode combinar uma ou mais expressões em uma função. Em vez de repetir a mesma série de expressões sempre que precisar do resultado, você pode colocar as expressões em uma função e chamar essa função.

Para declarar uma função, use a palavra-chave fun seguida do nome da função. Em seguida, defina o tipo de entrada que a função recebe (se houver) e declare o tipo de saída que ela retorna. No corpo da função, você define a expressão que é chamada quando a função é chamada.

Com base nos exemplos anteriores, veja uma função completa do Kotlin:

A função no exemplo acima é denominada generateAnswerString. Nenhuma entrada necessária. Produz um resultado do tipo string. Para chamar uma função, use seu nome seguido do operador de chamada (()). No exemplo abaixo, a variável answerString é inicializada com o resultado de generateAnswerString() .

Ao declarar uma função, você pode especificar qualquer número de parâmetros e tipos. No exemplo acima, generateAnswerString() aceita um parâmetro do tipo Int chamado countThreshold . Em uma função, você pode usar o nome do parâmetro para se referir ao parâmetro.

Ao chamar esta função, você precisa colocar um parâmetro entre parênteses da chamada da função:

val respostaString = gerarAnswerString(42)
Como simplificar declarações de funções
generateAnswerString() é uma função muito simples. A função declara uma variável e a retorna imediatamente.

Você também pode substituir a palavra-chave de retorno pelo operador de atribuição:

Funções anônimas

Além disso, nem todas as funções exigem nomes. Portanto, algumas funções são identificadas mais diretamente por suas entradas e saídas. Ou seja, essas funções são chamadas de funções anônimas. Você pode manter uma referência a uma função anônima usando essa referência para chamar a função anônima posteriormente. Assim como outros tipos de referência, você também pode passar referências em seu aplicativo.

Assim como as funções nomeadas, as funções anônimas podem conter qualquer número de expressões. O valor de retorno da função é o resultado da expressão final.

Em outras palavras, No exemplo acima, stringLengthFunc contém uma referência a uma função anônima que recebe uma string como entrada e retorna o comprimento da string de entrada como uma saída do tipo Int. Portanto, o tipo da função é representado como (String) -> Int. No entanto, esse código não chama a função. Para recuperar o resultado de uma função, você precisa chamá-la como uma função nomeada. Forneça uma String ao chamar stringLengthFunc, como no exemplo a seguir:

Funções de ordem superior

Uma função pode receber outra função como argumento. Esse padrão é útil para comunicação entre componentes, assim como você pode usar interfaces de retorno de chamada em Java.

Veja um exemplo de uma função de ordem superior:

A função stringMapper() recebe uma String junto com uma função que deriva um valor Int da String passada para ela.

Você pode chamar stringMapper() passando uma String e uma função que satisfaça outro parâmetro de entrada, uma função que recebe uma String como entrada e gera um Int, como no exemplo a seguir:

Para obter mais informações, consulte Funções de ordem superior e Lambdas.

Classe

Todos os tipos mencionados até agora estão integrados à linguagem de programação Kotlin. Se você quiser adicionar tipos personalizados, defina a classe com a palavra-chave class, conforme mostrado no exemplo a seguir:

carro de classe
característica
Em resumo, as classes usam propriedades para representar o estado. Ou seja, uma propriedade é uma variável de nível de classe que pode incluir um getter, um setter e um campo de apoio. Portanto, como um carro precisa de rodas para girar, você pode adicionar uma lista de objetos Wheel como uma propriedade de Car , como no exemplo a seguir: O que é a linguagem em Kotlin?

class Car {
val wheels = listOf()
}
Se você quiser ter uma instância de Car , primeiro você precisa chamar seu construtor. A partir daí, você pode acessar qualquer propriedade acessível.

val car = Car() // constrói o carro
val Wheels = car.wheels // recupera os valores das rodas do carro

class Car(val wheel: List)
No exemplo acima, o construtor de classe usa List como um parâmetro de construtor e usa esse parâmetro para inicializar a propriedade Wheels.

Funções de classe e encapsulamento
Além disso, as classes usam funções para modelar o comportamento. As funções podem modificar o estado, ajudando você a expor apenas os dados que deseja expor.

Para desbloquear o carro, você precisa chamar a função unlockDoor() e passar uma chave válida, como no exemplo a seguir: O que é a linguagem em Kotlin?

Combinando propriedades e funções, você pode criar classes que simulam vários objetos.

Interoperabilidade

Em suma, uma das características mais importantes do Kotlin é sua interoperabilidade suave com Java. Isso significa que você pode aproveitar as bibliotecas Java existentes diretamente do Kotlin.

Para concluir

Por fim, Kotlin é uma linguagem flexível e prática com crescente compatibilidade e dinâmica. Ou seja, se você ainda não o fez, nós o encorajamos a experimentá-lo. Portanto, para as próximas etapas, confira a documentação oficial do Kotlin para obter orientações sobre como aplicar padrões Kotlin comuns em seu aplicativo Android. Veja esse artigo.

Artigo escrito por: J. Cesar