- Temos senteças de códigos que podem ou não terminar com ponto e vírgula.
- Sentenças ficam dentro de blocos, que podem ser blocos aninhados.
-
.kt
é a extensão padrão de um arquivo Kotlin.
- Temos comentários para KDoc.
- Temos comentários simples de uma única linha.
- Temos comentários em bloco.
O Kotlin
é uma linguagem fortemente tipada.
Isso significa que, quando eu crio uma variável do tipo int
, não posso
atribuir depois para essa variável o tipo string
.
Como o Kotlin é uma linguagem fortemente tipada, precisamos ou inicializar ou inferir a variável.
Muito cuidado quando aplicar inferências, sempre prefira utilizar as variáveis com seu tipo declarado.
Constantes são definidas utilizando a palavra reservada val
.
Uma das vantagens do Kotlin
, é que podemos utilizar o Java
normalmente.
Portanto, podemos migrar código Java
para Kotlin
, de forma
totalmente gradual.
byte | 1 byte |
short | 2 bytes |
int | 4 bytes |
long | 8 bytes |
Lembrando que os tipos numéricos possuem um range que vão dos negativos aos positivos.
Tudo em Kotlin é objeto, inclusive os literais e tipos básicos.
Como criar funções.
1)
fun nomeFuncao(param: Tipo): TipoRetorno{}
2)
fun nomeFuncao(): TipoRetorno{}
3)
fun nomeFuncao(param: Tipo){}
Veja que assim como no Javascript
, o Kotlin
possui a possibilidade
de realizarmos interpolação de variáveis utilizando o template string.
Vamos para algumas considerações importantes. Como dissemos anteriormente, tudo em Kotlin é um objeto.
E podemos acessar os métodos através do literais, portanto o código abaixo é válido no kotlin
.
fun main(args: Array) {
val a: Int = 33.dec();
var b: String = a.toString();
println("Int: ${a}");
println("Primeiro char da string b é: ${b.first()}");
}
Muito semelhante ao java pode utilizar o interrogação para evitarmos acessar o atributo ou método de um objeto que
esteja null
.
fun main(args: Array) {
var a: Int? = null; // Safe call operator
println(a?.dec());
}
O operador Elvis nos ajuda a definir um valor default, caso o valor que estamos querendo atribuir seja inválido.
Veja o o código abaixo que tenho duas constantes.
Na primeira constante, o opcional
é uma string
com um safe call operator
e é atribuído
para essa constante o null
.
Logo abaixo temos a constante obrigatorio
, que também é uma string
, e estamos atribuindo
o valor da constante opcional
.
Obviamente ocasionará um erro, pois a constante obrigatorio não possui um safe call operator,
permitindo a atribuição de valores nulos.
fun main(args: Array) {
val opcional: String? = null;
val obrigatorio: String = opcional ?: "Valor Default";
}
Dessa forma utilizamos o operador elvis
, que nos permitirá atribuir um valor default
caso não consiga resolver para o primeiro valor, o valor default será atribuído.
Bem...pelo menos no Kotlin o Elvis não morreu mesmo.
Estrutura de controle
Um ponto interessente que temos no Kotlin
e não tínhamos no Java
, é que podemos utilizar
um bloco de if
e else
, como uma expressão para atribuirmos um valor em uma variável ou constante.
Veja o exemplo do código abaixo
Apenas uma observação importante, é que obrigatoriamente a última setença do bloco deve ser o retorno do valor para aquela expressão.fun main(args: Array) { val num1: Int = 2; val num2: Int = 3;
val maiorValor = if(num1 > num2) { println("processando"); num1; } else { println("processando"); num2; } println("O maior valor é ${maiorValor}!");
}
Por isso temos:
num1;
ao final do if
, e num2;
ao final do else
.
Utilizando when
Utilizando um laço for com range operatorfun main(args: Array) { val nota = 10; //Utilizando inferência
when(nota){ 10, 9 -> println("Fantástico"); 8, 7 -> println("Parabéns"); 6, 5, 4 -> println("Tem como recuperar"); in 0..3 -> println("Te vejo no próximo semestre"); else -> println("Nota inválida"); }
}
fun main(args: Array) {
val initialValue: Int = 1;
val maxValue: Int = 10;
for(value in initialValue..maxValue){
println("Verificando o valor do contador $value");
}
}
for(i in 10 downTo 1){
println("i = $i");
}
fun main(args: Array) {
val alunos = arrayListOf("Thadeu", "Guilherme", "Clayton", "Fernando", "Philipe");
for ((indice, aluno) in alunos.withIndex()){
println("Indice $indice - Aluno $aluno");
}
}