Slide 1

Slide 1 text

DIMINUA SEU CÓDIGO JAVA COM KOTLIN

Slide 2

Slide 2 text

‣ Linguagem de Programação Estaticamente Tipada ‣ Roda na JVM ‣ Possui 100% de Interop com Java ‣ Open Source ‣ Foca na simplicidade e na redução da verbosidade

Slide 3

Slide 3 text

Plataformas Suportadas ‣ Android ‣ Server-side ‣ Desktop ‣ Compila para Javascript

Slide 4

Slide 4 text

Declarando variáveis val nomeImutavel: String = "Fulano"
 val nomeImplicitoImutavel = "Fulano"
 
 var nomeMutavel = "Ciclano"
 nomeMutavel = "Outro Nome"
 
 nomeImutavel = "Tentando mudar Fulano Imutável"

Slide 5

Slide 5 text

Classes class ClasseVazia()
 class ClasseComPropriedades(var propriedadeComGetSet: String)
 class Pessoa(var nome: String) {
 fun ola() {
 println("Hello World!")
 }
 }
 
 val pessoa = Pessoa("Fulano") pessoa.nome = "Ciclano"
 println(pessoa.nome)
 pessoa.ola()

Slide 6

Slide 6 text

public class PessoaEmJava {
 private String nome;
 
 public PessoaEmJava(String nome) {
 this.nome = nome;
 }
 
 public String getNome() {
 return nome;
 }
 
 public void setNome(String nome) {
 this.nome = nome;
 }
 
 public void ola() {
 System.out.println("Hello World");
 }
 }
 
 PessoaEmJava pessoaEmJava = new PessoaEmJava("Fulano");
 pessoaEmJava.setNome("Ciclano")
 System.out.println(pessoaEmJava.getNome())
 pessoaEmJava.ola(); class PessoaEmKotlin(var nome: String) {
 fun ola() {
 println("Hello World!")
 }
 }
 
 val pessoa = Pessoa("Fulano") pessoa.nome = "Ciclano"
 println(pessoa.nome)
 pessoa.ola()

Slide 7

Slide 7 text

Construtores class Evento(private val milissegundos: Long = 0) {
 
 constructor(data: Date): this(data.time) {
 println("Chamou construtor opcional")
 }
 
 init {
 //Código de inicialização
 println("Inicializado")
 }
 }
 
 Evento(Date())
 Evento(100000)
 Evento()

Slide 8

Slide 8 text

Métodos private fun metodoPadraoSemRetorno(param1: String, param2: Int) {
 }
 
 internal fun metodoPadraoComRetorno(param1: String): Int {
 return 0
 }
 
 fun metodoComAtalho(array: Array) = array.size

Slide 9

Slide 9 text

Propriedades class Propriedades {
 var propriedadeComGetSet: String = "Inicializador"
 
 var propriedadeCustomizadaGetSet = "Teste"
 set(value) {
 if (value.length > 10) {
 println("O nome possui mais que 10 caracteres")
 }
 }
 
 var nome: String = "Fulano"
 set(value) {
 if (value.length < 10) {
 field = value
 }
 }
 }

Slide 10

Slide 10 text

Estruturas de controle (if) if (media >= 7) {
 println("O aluno passou!")
 }
 else {
 println("O aluno reprovou")
 }
 
 val valorMaximoInline = if (numero1 > numero2) numero1 else numero2
 
 val valorMaximo = if (numero1 > numero2) {
 println("num1 é maior!")
 numero1
 }
 else {
 println("num2 é maior!")
 numero2
 } if (numero1 in 0 .. 100 step 2) {
 println("numero1 é par entre 0 e 100")
 }

Slide 11

Slide 11 text

Estruturas de controle (for) val valores = intArrayOf(1, 2, 3, 4, 5)
 for(i in valores) {
 println(i)
 }
 
 for(i in 0 until valores.size) {
 println(valores[i])
 }
 
 for(i in valores.size - 1 downTo 0) {
 println(valores[i])
 }
 
 for(i in 0 until valores.size step 2) {
 println(valores[i])
 }

Slide 12

Slide 12 text

Bônus: Métodos infix infix fun Int.somar(outroNumero: Int) = this + outroNumero 1.somar(2) 1 somar 2
 
 class UmaClasse {
 infix fun metodoInfix(nome: String) = "A" + nome
 } val umaClasse = UmaClasse()
 println(umaClasse metodoInfix "Olá")

Slide 13

Slide 13 text

Estruturas de controle (when) (when) when(estado) {
 Estados.Comecou -> println("Comecou o processamento")
 Estados.Processando -> println("Está processando")
 Estados.Falhou, Estados.Concluiu -> println("Não está mais processando")
 }
 
 when (x) {
 in 1..10 -> print("X está no limite")
 in numerosValidos -> print("X é valido")
 !in 10..20 -> print("X está fora do limite")
 else -> print("Nenhuma das opções")
 }
 
 val numeroMaximo = when {
 numero1 > numero2 -> numero1
 else -> numero2
 }

Slide 14

Slide 14 text

‣ Gera os métodos de Java Beans automaticamente ‣ hashCode, toString e copy Data Classes data class DadosPessoa(val rg: String, val nome: String)
 
 val pessoa = DadosPessoa("11222333-4", "Fulano") val novaPessoa = pessoa.copy(rg = "33444555-6")
 pessoa.hashCode()
 pessoa.toString() //DadosPessoa(rg=11222333-4, nome=Fulano)
 if (pessoa == novaPessoa) {
 //...
 }
 val (rg, nome) = pessoa

Slide 15

Slide 15 text

Null Safety - Java if (classePai != null && classePai.getClasseFilha() != null && classePai.getClasseFilha().getClasseSubFilha() != null) {
 classePai.getClasseFilha().getClasseSubFilha().metodo();
 }

Slide 16

Slide 16 text

Null Safety - Kotlin classePai?.classeFilha?.classeSubFilha?.metodo()

Slide 17

Slide 17 text

Null Safety - Java void cadastrarPessoa(Pessoa pessoa) {
 if (pessoa == null) {
 throw new NullPointerException(“Pessoa nula!");
 }
 
 bancoDeDados.inserirPessoa(pessoa);
 }
 
 //!!!!
 cadastrarPessoa(null);
 
 Pessoa pessoa = possuiPessoaCadastrada("123456789");
 if (pessoa != null) {
 pessoa.ola();
 }

Slide 18

Slide 18 text

Null Safety - Kotlin fun cadastrarPessoa(pessoa: Pessoa) {
 bancoDeDados.inserirPessoa(pessoa)
 }
 
 fun possuiPessoaCadastrada(rg: String): Pessoa? {
 //...
 }
 
 cadastrarPessoa(null) <- Erro ❌ 
 possuiPessoaCadastrada(“123456789")?.ola() possuiPessoaCadastrada(“123456789")!!.ola() <— Perigo! ⚠ val idade = pessoa?.idade ?: -1

Slide 19

Slide 19 text

Expressões Lambda fun testeLambda(expressao: (Int) -> (Int)) {
 expressao(0)
 }
 
 typealias Expressao = (Int) -> (Int)
 fun testeLambda2(expressao: Expressao) {
 expressao(0)
 }
 
 fun filtrar(colecao: Array, filtro: (String) -> Boolean) {
 //...
 }
 
 testeLambda({ it * 2 })
 
 //Atalho
 testeLambda { it * 2 }
 
 filtrar(arrayOf("A", "B")) { it -> it.length == 1 } valores.forEach { println(it) }

Slide 20

Slide 20 text

Extensões fun Collection.somentePares(): Collection = filter { it % 2 == 0 }
 fun Collection.somenteImpares(): Collection = filter { it % 2 != 0 }
 
 val somentePares = listOf(1,2,3,4,5,6,7,8,9).somentePares()
 val somenteImpares = listOf(1,2,3,4,5,6,7,8,9).somenteImpares()

Slide 21

Slide 21 text

“Extensões" - Java public class ExtensaoCollection {
 private ExtensaoCollection() {}
 
 public static Collection somentePares(Collection colecao) {
 return colecao.stream().filter(numero -> numero % 2 == 0).collect(Collectors.toList());
 }
 
 public static Collection somenteImpares(Collection colecao) {
 return colecao.stream().filter(numero -> numero % 2 != 0).collect(Collectors.toList());
 }
 } List numeros = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9));
 Collection somentePares = ExtensaoCollection.somentePares(numeros);
 Collection somenteImpares = ExtensaoCollection.somenteImpares(numeros);

Slide 22

Slide 22 text

Singletons object Singleton {
 init {
 //Código de inicialização
 }
 
 fun metodo1() {
 }
 
 fun metodo2() {
 }
 }
 
 Singleton.metodo1()
 Singleton.metodo2() public class SingletonJava {
 private SingletonJava() { //Código de inicialização }
 
 public static void metodo1() { }
 
 public static void metodo2() { }
 }
 
 SingletonJava.metodo1();
 SingletonJava.metodo2();

Slide 23

Slide 23 text

Formatação de Strings println("A média tirada por ${pessoa.nome} foi $media")
 
 //Java Style
 println(String.format("A média tirada por %s foi %f", pessoa.nome, media))
 
 println("A média tirada por " + pessoa.nome + " foi " + media)

Slide 24

Slide 24 text

Coleções listOf(1,2,3,4,5,6)
 
 val listaMutavel = mutableListOf(1,2,3,4,5,6)
 listaMutavel.add(7)
 
 setOf(1,2,3,4,5,6,6,7)
 val setMutavel = mutableSetOf(1,2,3,4,5,6,6,7)
 setMutavel.add(7)
 
 val map = mapOf(1 to "Ciclano", 2 to "Fulano")
 val mapMutavel = mutableMapOf(1 to "Ciclano", 2 to "Fulano")
 mapMutavel.put(3, "Terceiro")
 
 for((numero, nome) in map) {
 }

Slide 25

Slide 25 text

Operator With class Classe() {
 fun metodo1() {}
 fun metodo2() {}
 fun metodo3() {}
 } 
 val classe = Classe()
 
 classe.metodo1()
 classe.metodo2() classe.metodo3()
 
 with(classe) {
 metodo1()
 metodo2()
 metodo3()
 }

Slide 26

Slide 26 text

Java X Kotlin public class ClasseJava {
 public void metodoJava() {
 new ClasseKotlin().metodoKotlin();
 }
 } class ClasseKotlin {
 fun metodoKotlin() {
 ClasseJava().metodoJava()
 }
 } fun codigoFrameworkJava() {
 val array = ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9))
 array.stream().filter { it % 2 == 0 }
 array.stream().filter(object: Predicate {
 override fun test(t: Int): Boolean {
 return t % 2 == 0
 }
 
 })
 
 System.out.println()
 }

Slide 27

Slide 27 text

‣ Smart casts ‣ Sobrecarga de operadores ‣ Co-rotinas ‣ DSLs e Builders Outros recursos

Slide 28

Slide 28 text

DSLs e Builders html {
 head {
 title { +"Dev Talks - Homepage" }
 }
 body {
 h1 { +"Dev Talks" }
 p { +"this format can be used as an alternative markup to XML" }
 p {
 +"This is some"
 b { +"mixed" }
 +"text. For more see the"
 a(href = "http://jetbrains.com/kotlin") { +"Kotlin" }
 +"project"
 }
 p { +"some text" }
 }
 }

Slide 29

Slide 29 text

‣ https://kotlinlang.org ‣ https://try.kotlinlang.org/ ‣ https://kotlin.link Dúvidas? victor5171 victor5171