Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DevTalks #16 - Diminua seu código Java com Kotlin

DevTalks #16 - Diminua seu código Java com Kotlin

Talk ministrada pelo Victor Oliveira na Partner Fusion Brasil.

DevTalks Bauru

November 23, 2017
Tweet

More Decks by DevTalks Bauru

Other Decks in Programming

Transcript

  1. ‣ 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
  2. Declarando variáveis val nomeImutavel: String = "Fulano"
 val nomeImplicitoImutavel =

    "Fulano"
 
 var nomeMutavel = "Ciclano"
 nomeMutavel = "Outro Nome"
 
 nomeImutavel = "Tentando mudar Fulano Imutável"
  3. 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()
  4. 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()
  5. 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()
  6. Métodos private fun metodoPadraoSemRetorno(param1: String, param2: Int) {
 }
 


    internal fun metodoPadraoComRetorno(param1: String): Int {
 return 0
 }
 
 fun metodoComAtalho(array: Array<Int>) = array.size
  7. 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
 }
 }
 }
  8. 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")
 }
  9. 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])
 }
  10. 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á")
  11. 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
 }
  12. ‣ 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
  13. Null Safety - Java if (classePai != null && classePai.getClasseFilha()

    != null && classePai.getClasseFilha().getClasseSubFilha() != null) {
 classePai.getClasseFilha().getClasseSubFilha().metodo();
 }
  14. 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();
 }
  15. 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
  16. Expressões Lambda fun testeLambda(expressao: (Int) -> (Int)) {
 expressao(0)
 }


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

    == 0 }
 fun Collection<Int>.somenteImpares(): Collection<Int> = 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()
  18. “Extensões" - Java public class ExtensaoCollection {
 private ExtensaoCollection() {}


    
 public static Collection<Integer> somentePares(Collection<Integer> colecao) {
 return colecao.stream().filter(numero -> numero % 2 == 0).collect(Collectors.toList());
 }
 
 public static Collection<Integer> somenteImpares(Collection<Integer> colecao) {
 return colecao.stream().filter(numero -> numero % 2 != 0).collect(Collectors.toList());
 }
 } List<Integer> numeros = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9));
 Collection<Integer> somentePares = ExtensaoCollection.somentePares(numeros);
 Collection<Integer> somenteImpares = ExtensaoCollection.somenteImpares(numeros);
  19. 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();
  20. 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)
  21. 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) {
 }
  22. Operator With class Classe() {
 fun metodo1() {}
 fun metodo2()

    {}
 fun metodo3() {}
 } 
 val classe = Classe()
 
 classe.metodo1()
 classe.metodo2() classe.metodo3()
 
 with(classe) {
 metodo1()
 metodo2()
 metodo3()
 }
  23. 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<Int> {
 override fun test(t: Int): Boolean {
 return t % 2 == 0
 }
 
 })
 
 System.out.println()
 }
  24. 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" }
 }
 }