Documente Academic
Documente Profesional
Documente Cultură
Julio Bissoli
Lorena Bassani
Murilo Scalser
Ricardo Braun
1
03 - História
06 - Mini Tutorial
19 - Explicação Teórica
86 - Avaliação da Linguagem
111 - Trabalho Prático
2
História
3
História
● Kotlin é uma linguagem de programação desenvolvida pela JetBrains.
● Anunciada em 2011 porém primeira versão estável foi em 2016.
● Motivação: melhorar a produtividade; Obter uma linguagem com uma sintaxe
mais simples, de fácil aprendizado e ao mesmo tempo com maior desempenho.
● Em 2017 se tornou a nova linguagem oficial da plataforma Android.
4
Influências
Scala Permissões
Groovy ● Uso comercial
● Modificação
● Distribuição
● Uso de patentes
● Uso privado
C#
Limitações
● Uso de marca registrada
● Responsabilidade
Java ● garantia
Script Condições
Java
● Licença e aviso de direitos
autorais
5
● Mudanças de estado
Mini tutorial
6
Começando
7
Kotlin Standard Library
● kotlin.annotation ● kotlin.math
● kotlin.browser ● kotlin.native
● kotlin.collections ● kotlin.native.concurrent
● kotlin.comparisons ● kotlin.native.ref
● kotlin.concurrent ● kotlin.properties
● kotlin.contracts ● kotlin.random
● kotlin.coroutines ● kotlin.ranges
● kotlin.coroutines.experimental ● kotlin.reflect
● kotlin.coroutines.experimental.intrinsics ● kotlin.reflect.full
● kotlin.coroutines.intrinsics ● kotlin.reflect.jvm
● kotlin.dom ● kotlin.sequences
● kotlin.experimental ● kotlin.streams
● kotlin.io ● kotlin.system
● kotlin.js ● kotlin.text
● kotlin.jvm ● kotlinx.cinterop
● kotlin.jvm.functions ● kotlinx.wasm.jsinterop 8
Hello World
Comentários - Igual a JAVA
/*Funções podem ter o corpo de expressão e tipo de fun foo(<param : Tipo>) : <Tipo de retorno>{
retorno implícitos */ //implementação
fun subtrai(a: Int, b: Int) = a - b }
fun printSoma(a: Int, b: Int): Unit{ Mas funções também podem ter o corpo de
println(“soma de $a e $b é ${a+b}”) expressão e tipo de retorno implícitos
}
fun foo(<param : Tipo>) = <expressão>
/*type Unit é quando o retorno não tem valor
significativo e este também pode ser omitido */
Tipo Unit – O tipo Unit é semelhante ao
fun printSub(a: Int, b: Int){
println(“subtração de $a e $b é ${a-b}”) void e pode ser omitido quando é retorno
} em função. 10
Sintaxe Básica
//Variaveis imutaveis Variáveis Mutáveis - variáveis usuais
val cidade: String= “Vitória”
val anoNascimento = 1996 Variáveis Imutáveis - semelhante às
constantes
//Variaveis mutaveis
var nome: String = “Lucas” Expressões Condicionais – A expressão
var idade = 22 if-else pode ser usado para obter um
valor.
//Expressões Condicionais Nesse caso o else é obrigatório.
if (a > b) { return a
} else { return b }
class Construtor {
init {
println("Init block")
} Construtor Secundário
constructor(i: Int) {
println("Constructor")
}
} 13
Late Init
class ExemploLateInit{
private lateinit var inicializaDepois : IntRange
Late Init – Inicialização de propriedade
fun InicializaVal(inicializador: Int){ posteriormente, não no construtor.
inicializaDepois = IntRange(0, inicializador)
} A lateinit inicializa com null.
exemplo.InicializaVal(9)
exemplo.InicializaVal(9)
Saída:
exemplo.getInicializaDepois().forEach { i -> print("$i ") } 0123456789
} 15
Loops e Controle de Fluxo
// Usando o ‘for’ em loops Loops – for e while.
val itens = listOf(“Ola”, “Mundo”)
for (item in itens){
println(item)
}
17
Quebra de fluxo em laço
Explicação Teórica
19
Características
20
Características
● HTML Builder
21
Execução
22
Execução
alert(myModule.foo());
Interpretada
Compilada
Híbrida
Código Kotlin em JavaScript
Permitindo que um programa Kotlin rode sem uma máquina virtual Java. É utilizado
principalmente para incluir em projetos com outra linguagens tais quais C, C++,
Swift, Objective-C, entre outras.
javaThread.start()
javaThread.join()
}
Pode ser Híbrida:
● Compilada para bytecode da JVM
● 100% compatível com Java
● Pode ser chamada em código Java
● Pode chamar código Java
25
O maior foco de Kotlin é ser Híbrida e rodar na JVM.
Paradigmas
class imp : Runnable{ ● Orientado a Objetos
override fun run(){
println( O principal paradigma de Kotlin é
"Estou implementando uma Interface!!") orientado a objetos, com classes
} e herança.
}
26
Amarrações
27
Amarrações
● A Linguagem possui amarração estática
e escopo estático e aninhado.
28
Amarrações
● A Linguagem possui amarração estática
e escopo estático e aninhado.
29
Amarrações
● A inferência de tipos ocorre em tempo de
compilação
Kotlin
runtime
*.kt Compilador
Kotlin
Compilador
*.java
Java
30
Identificadores
● Palavras Chave (Hard Keywords)
31
Identificadores
● Os tokens a seguir agem como palavras-chave no contexto
quando são aplicáveis e podem ser usados como
identificadores em outros contextos (Soft Keywords)
by catch constructor delegate
where
32
Identificadores
● (Modifier Keywords)
class Teste {
public val nome = "Nome"
}
33
Identificadores
● (Modifier Keywords)
class Teste {
public val nome = "Nome" saída:
} Publica
Nome
34
Identificadores
Não é permitido declarar identificadores:
@minhaVar 1minhaVar
Operadores Igualdade
Igualdade
Matemáticos Referencial
== !=
+ - / % * === !==
Incremento e Verificador de
Operadores Lógicos
Decremento Nulidade
&& || !
++ -- ? ?. ?:
36
Operadores
Operador Método Operador Método
a++ a.inc(b) a[i] a.get(i)
a-- a.dec(b) a[i, j] a.get(i, j)
a+b a.plus(b) a[i_1, … , i_n] a.get(i_1, …, i_n)
a-b a.minus(b) a[i] = b a.set(i, b)
a*b a.times(b) a[i, j] = b a.set(i, j, b)
a/b a.div(b) a[i_1, … , i_n] = b a.set(i_1, …, i_n, b)
a%b a.rem(b) a == b a?.equals(b) ?:
(b === null)
a..b a.rangeTo(b)
a != b !(a?.equals(b) ?:
a += b a.plusAssign(b) (b === null) )
a -= b a.minusAssign(b) a>b a.compareTo(b) > 0
a *= b a.timesAssign(b) a<b a.compareTo(b) < 0
a /= b a.divAssign(b) a >= b a.compareTo(b) >= 0
37
a %= b a.remAssign(b) a <= b a.compareTo(b) <= 0
Operadores
Operador Método
a++ a.inc(b) fun main() {
a-- a.dec(b) var a = 2
a+b a.plus(b) var b = 4
a-b a.minus(b) println(a+b)
a*b a.times(b) println(a.plus(b))
a/b a.div(b) }
a%b a.rem(b)
a..b a.rangeTo(b)
a += b a.plusAssign(b)
a -= b a.minusAssign(b) Operadores podem ser usados na sua forma
a *= b a.timesAssign(b) mais conhecida ou como o método que
representa
a /= b a.divAssign(b)
38
a %= b a.remAssign(b)
Operadores
Operador Método
a++ a.inc(b) fun main() {
a-- a.dec(b) var a = 2
a+b a.plus(b) var b = 4
a-b a.minus(b) println(a+b)
a*b a.times(b) println(a.plus(b))
a/b a.div(b) } saída:
a%b a.rem(b) 6
a..b a.rangeTo(b) 6
a += b a.plusAssign(b)
a -= b a.minusAssign(b) Operadores podem ser usados na sua forma
a *= b a.timesAssign(b) mais conhecida ou como o método que
representa
a /= b a.divAssign(b)
39
a %= b a.remAssign(b)
Operadores
● Operador de chamada segura “?”
- Em Kotlin existe um operador que trata “nulables”. Evitando os terríveis
NullPointerException que acontecem normalmente em Java.
40
Operadores
● Operador de chamada segura “?”
- Em Kotlin existe um operador que trata “nulables”. Evitando os terríveis
NullPointerException que acontecem normalmente em Java.
41
Sobrecarga
● Sobrecarga de função: ● Sobrecarga de operadores
class Teste{
data class Point(val x: Int, val y: Int)
fun a(i: Int) = i
operator fun Point.unaryMinus() =
fun a(b: String) = b
Point(-x, -y)
}
fun main() {
fun main() {
var t = Teste()
val point = Point(10, 20)
println(t.a(2))
println(-point)
println(t.a("teste de sobrecarga"))
}
}
42
Sobrecarga
● Sobrecarga de função: ● Sobrecarga de operadores
class Teste{
data class Point(val x: Int, val y: Int)
fun a(i: Int) = i
operator fun Point.unaryMinus() =
fun a(b: String) = b
Point(-x, -y)
}
fun main() {
fun main() {
var t = Teste()
val point = Point(10, 20)
println(t.a(2))
println(-point)
println(t.a("teste de sobrecarga"))
}
}
saída: saída:
2 Point(x=-10, y=-20)
teste de sobrecarga 43
Tipos da
linguagem 44
Tipos Primitivos Básicos
Tipo Tamanho em Bits Exemplo
Double 64 123.5, 123.5e10
Float 32 123.5f , 123.5F
Long 64 123L
Int 32 123 , 0x0F , 0b00001011
Short 16 123
Byte 8 123
ULong 64 255u
UInt 32 255u
UShort 16 255u
UByte 8 255u
Char 16 ( UTF-16 ) ‘a’ , '\uFF00'
Boolean 8 true
45
Tipos Primitivos Básicos
fun main(args: Array<String>){ Kotlin não permite polimorfismo de
val inteira : Int = 4 coerção para atribuir valores a
val long : Long Type mismatch. variáveis e constantes.
Required: Long
long = inteira Found: Int
}
Map Set
47
Coleções de tipos kotlin.collections
ArrayList BooleanIterator ByteIterator CharIterator DoubleIterator
48
Tipos Compostos
Array
Vetores em Kotlin são dados pela classe Array.
Para criar um Array, usamos a função arrayOf( )
arrayOf(1, 2, 3) [1, 2, 3]
51
Passagem de Parâmetros
Em Kotlin, parâmetros podem ter
fun imprimeSaudacao(saudacao: String = "Olá!", valores padrão.
mensagem: String = "Sejam bem vindos",
nome : String = "Visitantes")
= println("$saudacao $mensagem, $nome!")
fun main( ){
val imprime : (String) -> Unit = { s -> println(s) }
54
Funções de Extensão
As funções do Kotlin são cidadãos de primeira classe , o que significa que elas podem
ser armazenadas em variáveis e estruturas de dados.
fun main() {
fun String.isValidaParaSenha() = this.count() >= 6
var a = "12345".isValidaParaSenha()
var b = "asdf12".isValidaParaSenha()
println("$a $b")
} saída:
false
true 55
Funções lambda
Funções lambda são funções que não são declaradas, mas são passadas
imediatamente como uma expressão.
56
Funções
Você poderia imaginar o que esse código faria.
fun main() {
val espia: (x:Int) -> Unit = { println("sou uma função escondida") }
fun soma(x:Int = 1) = espia
soma(1)(1)
}
57
Funções
● Over-Kotlin(uso exagerado da linguagem) pode atrapalhar no seu código
fun main() {
val espia: (x:Int) -> Unit = { println("sou uma função escondida") }
fun soma(x:Int = 1) = espia
soma(1)(1)
} saída:
sou uma função escondida
58
Funções Infixadas
● Regras:
Eles devem ser funções-membro ou funções de extensão
Eles devem ter um único parâmetro
O parâmetro não deve aceitar um número variável de argumentos e não deve ter
nenhum valor padrão
fun main() {
infix fun Int.murilo(x:Int) = (this * 2)+x
var x = 1 murilo 2 // 1.murilo(2)
println(x)
} saída:
4 59
Precedência de Operadores
Precedência Operadores Símbolos
Alta Pós fixado ++, --, ., ?., ?
-, +, ++, --, !,
Pré fixado labelDefinition
Tipo RHS :, as, as?
Multiplicativo *, /, %
Aditivo +, -
Intervalo ..
Função Infixada SimpleName
Elvis ?:
Checagem de
Nomes in, !in, is, !is
Comparação <, >, <=, >=
Igualdade ==, \!==
Conjunção &&
Disjunção ||
Baixa Atribuição =, +=, -=, *=, /=, %= 60
Curto circuito
fun main() {
var a : MutableList<Int> = mutableListOf()
var n = a.add(1)
a.addAll(listOf(1,2,3,4,5))
println("- Sou uma lista: $a . \n- Também sou uma lista: $n.")
}
saída:
- Sou uma lista: [1, 1, 2, 3, 4, 5]
- Também sou uma lista: true
62
Avaliação de expressões
● Kotlin pode ter avaliação tardia
val lazyValue: String by lazy { (lazy evaluation), quando
utilizado o paradigma funcional
println("computed!")
- Mas esse tipo de avaliação
"Hello" deve ser explicitada.
fun main() {
println(lazyValue) saída:
Ainda não computado
computed!
println(lazyValue)
Hello
63
Hello
}
Modularização
64
Hierarquia de classes Any?
Double? Int?
Any
Double Int
Nothing 65
Tipagem
Inferência de Tipo - Kotlin faz inferência de tipo.
fun main(args: Array<String>){
val tipada = 4
66
Herança
open class Base(p: Int) {
open fun v() { ... }
fun nv() { ... } Herança - Uma classe herda somente de uma
classe base.
}
class Derived(p: Int) : Base(p) {
override fun v() {
super.v( ) Amarração tardia - Executa sempre o métodos
//mais código da classe mais especializada.
}
}
69
Interfaces
interface MinhaInterface {
val test: String Interfaces - Podem ter métodos implementados
e declarar atributos.
fun foo() :String
fun hello() = "Hello there"
} Uma classe pode implementar mais de uma
interface.
class InterfaceImp : MinhaInterface, Runnable{
override fun run() {
println(this.foo() + " from ${this.test}")
}
fun main( ){
val box : Box<Int> = Box(42)
println(box.unbox())
} Saída:
42
71
Extensões
fun <T> MutableList<T>.swap(index1: Int, index2: Int) { Extensões - Permitem criar novos métodos
val tmp = this[index1] para classes já existentes,
this[index1] = this[index2]
this[index2] = tmp
}
fun main( ){
var lista = mutableListOf(1,2,3,4)
lista.swap(1,2)
lista.forEach({p -> print("$p ")})
} Saída:
1324
72
Exceções
73
Exceções
Exceções – Toda exceção em Kotlin é não
@Throws(IOException::class) checada.
fun readFile(name: String): String {...}
74
Exceções
/*Usando variáveis nulas ‘?’*/
//Elvis
val l = b?.length ?: -1 Elvis – Se a variável a esquerda não for null, retorna
ela, caso contrário retorna a expressão a direita
//Assumindo riscos
val l = b!!.length
//Safe casting
val aInt: Int? = a as? Int
75
Try-Catch e
Finally
/*Usando try catch ‘?’*/
try {
// código
}
catch (e: SomeException) {
// tratamento
}
finally { Throw como Nothing – Se a variável receber throw,
// bloco opcional e sempre executado o código depois dele não executa.
}
78
Threads
79
Co-rotinas
import kotlinx.coroutines.*
Coroutines - Threads Leves
fun main() {
val job = GlobalScope.launch {
delay(1000L) Quando suspendem a operação
println("World!") não bloqueia a thread.
}
println("Hello,")
runBlocking { Pode voltar a executar em
job.join() outra thread.
}
}
80
Co-rotinas
import kotlinx.coroutines.*
Coroutines - Threads Leves
fun main() {
val job = GlobalScope.launch {
delay(1000L) Quando suspendem a operação
println("World!") não bloqueia a thread.
}
println("Hello,")
runBlocking { Pode voltar a executar em
job.join()
Saída:
outra thread.
}
} Hello, World!
81
Co-rotinas
import kotlin.system.measureTimeMillis
import kotlinx.coroutines.*
fun meaninglessCounter(): Long { import kotlin.system.measureTimeMillis
var counter = 0L
for (i in 1..10_000_000_000) { fun meaninglessCounter(): Long { … }
counter += 1L
} fun main(args: Array<String>) {
return counter var time2 = measureTimeMillis {
}
runBlocking {
fun main(args: Array<String>) { val one = async { counter() }
val two = async { counter() }
var time = measureTimeMillis {
val one = meaninglessCounter() println(
val two = meaninglessCounter() "The answer is ${one.await() + two.await()}")
println("The answer is ${one + two}") }
} }
println("Sequential completed in $time ms") println("Concurrent completed in $time2 ms")
} }
82
Co-rotinas
import kotlin.system.measureTimeMillis
import kotlinx.coroutines.*
fun meaninglessCounter(): Long { import kotlin.system.measureTimeMillis
var counter = 0L
for (i in 1..10_000_000_000) { fun meaninglessCounter(): Long { … }
counter += 1L
} fun main(args: Array<String>) {
return counter var time2 = measureTimeMillis {
}
runBlocking {
fun main(args: Array<String>) { val one = async { counter() }
val two = async { counter() }
var time = measureTimeMillis {
val one = meaninglessCounter() println(
val two = meaninglessCounter() Saída: "The answer is ${one.await() Saída:
+ two.await()}")
The
println("The answer is answer
${one is 20000000000
+ two}") } The answer is 20000000000
} Sequential completed in 8285 ms } Concurrent completed in 7665 ms
println("Sequential completed in $time ms") println("Concurrent completed in $time2 ms")
} }
83
Igual a JAVA
84
Igual a Java
● Gerenciamento de Memória
● Não permite acesso à endereços reais
● Acesso a Memória Secundária
● Comentários no código
● Mecanismo Contra Colisão de Nomes
● Inclusão de bibliotecas
● JVM
85
Avaliação da
Linguagem 86
Avaliação
Critérios Gerais C++ Java Kotlin
87
Avaliação
Critérios Gerais C++ Java Kotlin
88
Avaliação
Critérios Gerais C++ Java Kotlin
89
Avaliação
Critérios Gerais C++ Java Kotlin
90
Avaliação
Critérios Gerais C++ Java Kotlin
91
Avaliação
Critérios Gerais C++ Java Kotlin
92
Avaliação
Critérios Gerais C++ Java Kotlin
94
Avaliação
Critérios Gerais C++ Java Kotlin
Passagem de Lista variável, default Lista variável, por valor Lista variável, por valor
Parâmetros por valor e por cópia e por cópia.
Posicional e por nome.
95
Avaliação
Critérios Gerais C++ Java Kotlin
Passagem de Lista variável, default Lista variável, por valor Lista variável, por valor
Parâmetros por valor e por cópia e por cópia.
Posicional e por nome.
96
Avaliação
Critérios Gerais C++ Java Kotlin
Passagem de Lista variável, default Lista variável, por valor Lista variável, por valor
Parâmetros por valor e por cópia e por cópia.
Posicional e por nome.
97
Avaliação
Critérios Gerais C++ Java Kotlin
Passagem de Lista variável, default Lista variável, por valor Lista variável, por valor
Parâmetros por valor e por cópia e por cópia.
Posicional e por nome.
98
Avaliação
Critérios Gerais C++ Java Kotlin
Passagem de Lista variável, default Lista variável, por valor Lista variável, por valor
Parâmetros por valor e por cópia e por cópia.
Posicional e por nome.
99
Avaliação
Critérios Gerais C++ Java Kotlin
Passagem de Lista variável, default Lista variável, por valor Lista variável, por valor
Parâmetros por valor e por cópia e por cópia.
● Grande Variedades
Posicional de
e por nome.
persistência de Dados 101
Avaliação
Critérios Gerais C++ Java Kotlin
Passagem de Lista variável, default Lista variável, por valor Lista variável, por valor
Parâmetros por valor e por cópia e por cópia.
Posicional e por nome.
102
Avaliação
Critérios Gerais C++ Java Kotlin
● Fortemente Tipada
● https://kotlinlang.org/docs/reference/
● https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/index.html
● https://movile.blog/programacao-assincrona-em-kotlin-dissecando-coroutines/
● https://antonioleiva.com/sealed-classes-kotlin/
● https://www.programiz.com/kotlin-programming/
● https://kotlinlang.org/foundation/kotlin-foundation.html
113