Minicurso ministrado na semana academica de TSI (Tecnologia em Sistemas para Internet) na UTFPR de Guarapuava, mostrando a linguagem Kotlin desde a criaçao de variavel até testes unitarios com o framework Spek e avaliação da qualidade de codigo com Detekt.
Agradeço a UTFPR pela oportunidade e ao meu grande amigo Rafael R. Benetti por topar esta empreitada comigo
2. Lucas A. R. Sartori
Desenvolvedor Mobile e back-
end
Tecnologia em Sistemas para
Internet (UTFPR -GP)
Estudo Angular desde quando
era tudo mato
Apaixonado por Kotlin e cerveja
belga
3. Paraguaio
Desenvolvedor Mobile e back-end na
Teorema Sistemas
Analista de sistemas
(UTCD - Paraguay)
Pós graduado em Sistemas para
Internet
(UNE - Paraguay)
5 anos de experiência com
desenvolvimento web
Palestrou no TDC Florianópolis 2018
Apaixonado por compartilhar
conhecimento
8. Definindo variáveis
val a: Int = 1 // tipagem explicita
val b = 2 //tipagem implícita, Int automaticamente
val c: Int // irá apontar erro, precisa inicializar a variável quando
a declarar
10. Definindo funções
fun sum(a: Int, b: Int): Int {
return a + b
}
fun sum(a: Int, b: Int): Int = a + b
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}")
}
fun printSum(a: Int, b: Int): Unit =
println("sum of $a and $b is ${a + b}”)
11. Classes de Dados - Java
class Pessoa{
private String nome;
private int idade;
public Pessoa(String nome, int idade){
this.nome = nome;
this.idade = idade
}
public void setIdade(int idade){
this.idade = idade;
}
public void setNome(String nome){
this.nome = nome
}
public void getIdade(){
return this.idade;
}
public void getNome(){
return this.nome;
}
}
12. Classes de Dados - Kotlin
data class Pessoa(var nome:String? = "", var
idade: Int)
13. data class Pessoa(var nome:String, var idade:
Int)
val pessoa = Pessoa("Goku", 30)
val pessoa:Pessoa = Pessoa("Goku", 30)
15. Herança
open class Animal{
open fun emitirSom() = "Gggrrrhhh"
}
class Goto(val name: String) : Animal(){
override fun emitirSom() = "Miauuu"
}
Para herdar uma classe devemos usar o sinal ( : )
O marcador override é obrigatório quando queremos subescrever
funções
Muito importante, para que a classe possa ser estendida deve ser
marcada como open
17. Variáveis e Imutabilidade
// Java
final View view; // Valor inalterado uma vez iniciado
final TextView txt; // Valor inalterado uma vez iniciado
int x = 0; // O tipo é explicitamente declarado
x = 1; // O compilador permite alterar o valor inicial
...
// Kotlin
val view: View // Valor inalterado uma vez iniciado
val txt: TextView // Valor inalterado uma vez iniciado
var x = 0 // O tipo é inferido automaticamente 'Int'
x = 1 // O compilador permite alterar o valor inicial
18. Variáveis e Imutabilidade
// Java
String name = "Java"; // declaração com o tipo explícito
...
// Kotlin
var name: String = "Kotlin"
var name = "Kotlin"
22. if/else e when
val max = if(a > b) a else b
val msg = when(x){
in 1..10, 100 -> "x esta entre 1 e 10 ou for 100"
in validNumbers -> "x é válido"
!in 10..20 -> "x não esta entre 10 e 20"
else -> "Nenhuma das opções"
}
24. Uso do array
fun main(args: Array<String>) {
var nomes = arrayOf("um", "dois", "tres", "quatro")
var numero = intArrayOf(1,2,3)
var numeros = longArrayOf(1,7,3)
println(nomes[1])
println(numeros[1])
}
25. Uso do loop
val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
println(item)
}
ou
val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
println("item at $index is ${items[index]}")
}
26. Uso do loop
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
array.forEachIndexed { index, value ->
println("the element at $index is $value")
}
27. Uso do loop
for ( i in 0..10) {
print (“Hello $i”)
}
for ( i in 0..10 step 2) {
print (“Hello $i”)
}
for ( i in 10..0 step 2) {
print (“Hello $i”)
}
for ( i in 10 downTo 0 step 2) {
print (“Hello $i”)
}
28. Uso de coleções
for (item in items) {
println(item)
}
items.forEach { item ->
println(item)
}
Verificando se a coleção contem um objeto usando o operador in:
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}
29. Uso de coleções
Usando lambda para filtrar um mapa de coleções:
val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }
30. Null safety
Tipo Non-Null
var a: String = "goku"
a = null // erro de compilação
Tipo Nullable
var a: String? = "goku"
a = null // todo mundo feliz
31. Null safety
var texto: String? = "alguma coisa"
println(texto.length) //Não compila, texto não pode ser nulo
var texto: String = "alguma coisa"
if(texto != null) //Smart Cast
println(texto.length) // Todo mundo feliz
32. Null safety
var texto: String? = "alguma coisa"
println(texto!!.length)
var texto: String? = null
println(texto?.length)
33. Null safety
var age:Int? = null
Log.d("age", age!!.toString())
Log.d("age", age?.toString())
var something = nothing ?: "default"
40. Referencias do xml forma tradicional
<EditText
android:id="@+id/login_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/user"
android:inputType="textEmailAddress"
android:text="" />
EditText ed = (EditText) findViewById (R.id.login_name);
41. Referencias do xml com Kotlin
<EditText
android:id="@+id/login_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/user"
android:inputType="textEmailAddress"
android:text="" />
login_name
42. Gist com os build.gradle das
bibliotecas que serão utilizadas
https://bit.ly/2D3weap
46. Criando um Dialog
alert("Hi, I'm Roy", "Have you tried turning it off and on again?") {
yesButton { toast("Oh…") }
noButton {}
}.show()
Compartilhando em qualquer app de rede social instalado no celular
share("oi eu sou o goku")
52. Spek
@RunWith(JUnitPlatform::class)
class UserSpekTest : Spek({
val x = 2
val y = 3
describe("x = $x and y = $y") {
val sum = x + y
it("should be that x + y = 5") {
assertEquals(5, sum)
}
it("should be that x - y = -1") {
val subtract = x - y
assertEquals(-1, subtract)
}
}
})