Kotlin a Partir do Princípio: Variáveis, Tipos Básicos e Matrizes
() translation by (you can also view the original English article)
Kotlin é uma linguagem moderna de programação que é compilada em bytecode Java. É gratuita e de código aberto e promete fazer a codificação para o Android ainda mais divertida.
Kotlin é 100% interoperável com Java. Em outras palavras, ele pode ser usado junto com Java no mesmo projeto. Então você pode refatorar as partes do seu código Java para Kotlin e ele não quebrará. Além disso, é conciso, expressivo e possui ótimas ferramentas. Kotlin pode ser usado no back-end (do lado do servidor), mas está recebendo muita atenção agora como uma linguagem para desenvolvimento de aplicativos Android. Kotlin agora é suportado pela Google como uma linguagem de primeira classe para o desenvolvimento Android, então a popularidade de Kotlin está prestes a explodir!
Neste primeiro tutorial da série Kotlin a Partir do Princípio, você aprenderá sobre os fundamentos da linguagem: comentários, variáveis, tipos simples, matrizes e inferência de tipos.
Pré-requisitos
Para acompanhar-me, você precisará do Android Studio com plugin para o Kotlin. Alternativamente, você pode usar o online playground ou IntelliJ IDEA Community Edition.
1. Variáveis
Em Kotlin, use val
para declarar uma constante ou a palavra-chave var
para declarar uma variável. Você pode especificar um tipo como String
ou Int
após o nome da variável. No exemplo abaixo, nós declaramos uma constante firstName
do tipo String
com a palavra-chave val
.
1 |
val firstName: String = "Chike" |
Mas você logo vai perceber que em Kotlin, geralmente é possível omitir o tipo de declaração e o compilador não vai reclamar.
1 |
val lastName = "Mgbemena" // will still compile |
No código acima, você vai observar que nós não declarar explicitamente o tipo String. O código acima ainda funcionará porque o compilador inferiu implicitamente o tipo usando a inferência de tipos. Nós vamos voltar a isso!
A diferença entre as palavras-chave val
e var
é que a primeira é imutável ou somente leitura (seu valor não pode ser alterado), enquanto a última é mutável (seu valor pode ser alterado).
1 |
val dateOfBirth = "29th March, 1709" |
2 |
dateOfBirth = "25th December, 1600" // cannot be changed |
3 |
|
4 |
var car = "Toyota Matrix" |
5 |
car = "Mercedes-Maybach" // can be changed |
Observe que para uma variável declarada com a palavra-chave var
que tem seu tipo inferido pelo compilador, atribuir um valor de um tipo diferente, não funcionará. Em outras palavras, o valor da variável pode mudar, mas não seu tipo! Por exemplo:
1 |
var age = 12 |
2 |
age = "12 years old" // Error: type mismatch |
É altamente recomendável que você comece fazendo suas variáveis imutáveis, declarando-as com a palavra-chave do val
, para não manter muitos estados. Isso torna seu código mais seguro para multithreading, porque garante que suas variáveis não podem ser modificadas por outras threads inesperadamente.
Outra coisa que você deve saber sobre a palavra-chave val
é que você pode declará-la com um tipo só e atribuir um valor mais tarde. Mas você ainda só pode atribuir um valor de cada vez.
1 |
val carName: String |
2 |
carName = "Toyota Matrix" // will compile |
Em Java, é possível declarar múltiplas variáveis do mesmo tipo em uma única linha, mas isso não funciona no Kotlin. Em Kotlin, todas as declarações de variável devem estar em suas próprias linhas.
1 |
val carName = "BMW", streetName = "Oke street" // this won't compile |
2 |
|
3 |
// this will compile
|
4 |
var carName = "BMW" |
5 |
var streetName = "Oke street" |
2. Inferência de Tipos ou Dedução
Kotlin é uma linguagem fortemente tipada que oferece suporte a inferência de tipos ou dedução. Este é o mecanismo utilizado pelo compilador para descobrir os tipos do contexto. O Java não tem um mecanismo de inferência de tipos, o que significa que você deve declarar explicitamente o tipo de cada variável ou função. Inferência de tipos ajuda a reduzir o código clichê que você tem que escrever.
1 |
val country = "Nigeria" // type is inferred by compiler |
2 |
val code = 234 |
O código acima compilaria mesmo que nós não indicássemos explicitamente o tipo para a variável país. O compilador é suficientemente inteligente para saber que o país é do tipo String
, porque o valor, "Nigéria", é uma sequência de caracteres.
3. Tipos Básicos
Em Java, temos dois tipos de tipo — primitivos (por exemplo, int, byte, boolean, long, char, etc.) e tipos de referência (por exemplo, array, String
) . Java usa invólucros (como java.lang.Integer
) para fazer tipos primitivos se comportarem como objetos. Mas em Kotlin, não existe tal distinção. Em vez disso, todos os tipos são objetos.
Números
Os tipos inteiros disponíveis em Kotlin são:
-
Long
— 64 bits -
Int
— 32 bits -
Short
— 16 bits -
Byte
— 8 bits
Os tipos de ponto flutuante são:
-
Double
-64 bits -
Float
– 32 bits
1 |
val myInt = 55 |
2 |
val myLong = 40L |
3 |
val myFloat = 34.43F |
4 |
val myDouble = 45.78 |
5 |
val myHexadecimal = 0x0F |
6 |
val myBinary = 0b010101 |
Você pode observar que nós criamos um Long
literal, adicionando o sufixo L
, e para o Float
, acrescentamos o sufixo F
ou f
. Os números também podem ser escritos em notação hexadecimal, usando os prefixos 0x
ou 0X
e em binário usando os prefixos 0b
ou 0B
. Observe que, em todos estes casos, o Kotlin pode usar inferência de tipos para saber o tipo que queremos em vez disso.
1 |
val myLong = 19L |
2 |
val myLongAgain: Long = 40 |
Para converter um número de um tipo para outro, você precisa chamar explicitamente a função de conversão correspondente. Em outras palavras, não há nenhuma conversão implícita entre tipos de números.
1 |
val myNumber = 400 |
2 |
val myNumberAgain: Long = myNumber // throws Error: Type mismatch |
Cada tipo de número tem funções auxiliares que convertem de um tipo de número para outro: toByte()
, toInt()
, toLong()
, toFloat()
, toDouble()
, toChar()
, toShort()
.
1 |
val myInt = 987 |
2 |
val myLong = myInt.toLong() |
No código acima, nós convertemos de um número inteiro para um long. Podemos também fazer o inverso usando o método toInt()
na variável long. Observe que isso truncará o valor para se ajustar ao tamanho menor de um tipo Int
, se necessário - portanto, tenha cuidado ao converter de tipos maiores para menores!
Você também pode converter uma String em um tipo de número.
1 |
val stringNumber = "101" |
2 |
val intValue = stringNumber.toInt() |
No código acima, convertemos a variável stringNumber
em um tipo Int
, chamando o método toInt()
na variável. Podemos escrever isto de forma mais sucinta, em vez disso, chamando o método diretamente na sequência de caracteres:
1 |
val intValue = "101".toInt() |
O Tipo Booleano
O tipo Boolean
em Kotlin é o mesmo que em Java. Seu valor pode ser true ou false. As operações de disjunção(||)
, conjunção(&&)
e negação(!)
podem ser executadas em tipos booleanos, como em Java.
1 |
val myTrueBoolean = true |
2 |
val myFalseBoolean = false |
3 |
|
4 |
val x = 1 |
5 |
val y = 3 |
6 |
val w = 4 |
7 |
val z = 6 |
8 |
|
9 |
val n = x < z && z > w // n is true |
Strings
Strings podem ser criadas com aspas duplas ou aspas triplas. Além disso, os caracteres de escape podem ser usados com aspas duplas.
1 |
val myString = "This is a String" |
2 |
val escapeString = "This is a string with new line \n" |
Para criar uma sequência de caracteres que abrange várias linhas no arquivo de origem, nós usamos aspas triplas:
1 |
val multipleStringLines = """ |
2 |
This is first line
|
3 |
This is second line
|
4 |
This is third line """
|
Kotlin também oferece suporte a interpolação de strings ou de string templates. Esta é uma maneira mais fácil de construir strings dinâmicas do que a concatenação, que é o que usamos em Java. Usando string templates, podemos inserir variáveis e expressões em uma string.
1 |
val accountBalance = 200 |
2 |
val bankMessage = "Your account balance is $accountBalance" // Your account balance is 200 |
No código acima, criamos uma string literal e, dentro dela, nos referimos a uma variável pelo uso de um caractere $
na frente do nome da variável. Observe que, se a variável não está correta ou não existe, o código não compila.
E se você precisar usar $
na sua string? Você simplesmente escapa com \$
! Além disso, você pode chamar métodos de uma String
interpolada diretamente; você tem que adicionar chaves ${}
para envolvê-la.
1 |
val name = "Chike" |
2 |
val message = "The first letter in my name is ${name.first()}" // The first letter in my name is C |
Outra coisa legal que você pode fazer é executar alguma lógica dentro das chaves, ao criar uma String
literal.
1 |
val age = 40 |
2 |
val anotherMessage = "You are ${if (age > 60) "old" else "young"}" // You are young |
Matrizes
Em Kotlin, há duas maneiras principais para criar uma matriz: usando a função auxiliar arrayOf()
ou o construtor Array()
.
A Função arrayOf()
Por exemplo, vamos criar uma matriz com alguns elementos usando arrayOf()
.
1 |
val myArray = arrayOf(4, 5, 7, 3) |
Agora, para acessar qualquer um dos elemento, podemos usar seu índice: myArray[2]
. Observe que podemos passar valores de tipos diferentes para o arrayOf()
como argumentos e ainda funcionará — será uma matriz de tipo misto.
1 |
val myArray = arrayOf(4, 5, 7, 3, "Chike", false) |
Para forçar que todos os valores da matriz tenham o mesmo tipo, por exemplo Int
, declaramos o tipo chamando arrayOf<Int>()
ou intArrayOf()
.
1 |
val myArray3 = arrayOf<Int>(4, 5, 7, 3, "Chike", false) // will not compile |
2 |
val myArray4 = intArrayOf(4, 5, 7, 3, "Chike", false) // will not compile |
Temos também outras funções utilitárias para criar matrizes de outros tipos, como charArrayOf()
, booleanArrayOf()
, longArrayOf()
, shortArrayOf()
, byteArrayOf()
e assim por diante. Nos bastidores, usar essas funções irá criar uma matriz de seus respectivos tipos primitivos Java. Em outras palavras, intArrayOf()
irá compilar para o tipo primitivo normal de Java int[]
, byteArrayOf()
será byte[]
, longArrayOf()
será long[]
, e assim por diante.
O Construtor Array()
Agora vamos ver como criar uma matriz com Array()
. O construtor dessa classe requer um tamanho e uma função lambda. Vamos aprender mais sobre funções lambda mais tarde nesta série, mas por enquanto, apenas entenda que é uma maneira simples de declarar uma função anônima inline. Neste caso, o trabalho da função lambda é inicializar a matriz com os elementos.
1 |
val numbersArray = Array(5, { i -> i * 2 }) |
No código acima, nós passamos 5 como o tamanho da matriz no primeiro argumento. O segundo argumento leva uma função lambda, que recebe o índice do elemento da matriz e retorna o valor a ser inserido no índice na matriz. Assim, no exemplo acima, criamos uma matriz com elementos 0, 2, 4, 6 e 8.
4. Comentários
Isso é fácil. Em Kotlin, os comentários são os mesmos que em Java. Podemos usar comentários de bloco ou linha:
1 |
/*
|
2 |
hello, this is a block comment
|
3 |
with multiple lines.
|
4 |
This is another line.
|
5 |
This is another one again
|
6 |
*/
|
7 |
|
8 |
// this is a single line comment
|
Conclusão
Neste tutorial, você aprendeu os conceitos básicos da linguagem de programação Kotlin: variáveis, tipos básicos, inferência de tipos, matrizes e comentários. No próximo tutorial da série Kotlin a Partir do Princípio, você vai aprender sobre laços, intervalos, condições, coleções e pacotes em Kotlin. Te vejo em breve!
Para saber mais sobre a linguagem Kotlin, eu recomendo visitar a documentação Kotlin. Ou confira alguns dos nossos outros tutoriais de Kotlin aqui no Envato Tuts +.
- SDK do AndroidQuick Tip: Write Cleaner Code With Kotlin SAM ConversionsAshraff Hathibelagal
- Android StudioCoding Functional Android Apps in Kotlin: Getting StartedJessica Thornsby
- Android SDKJava vs. Kotlin: Should You Be Using Kotlin for Android Development?Jessica Thornsby