IntelliJ, WebStorm, Goland, DataGrip, etc...) estava atrás de uma linguagem mais produtiva, funcional e menos verbosa, características que Java não possuia, o foco dessa procura era melhorar os aspectos de desenvolvimento de software das ferramentas que desenvolvia, que eram todas feitas em Java, no ocorrido uma das soluções pensadas e testadas foi Scala, que também roda sobre a JVM, mas Scala acabou sendo descartada porque sua performance do aspecto compilação se tornou um impeditivo. Então em 2011 a JetBrains criou Kotlin para resolver esse problemas, Kotlin então se tornou público e open em 2012 e teve sua primera versão fechada (v 1.0) em 2016. Atualmente Kotlin é mantido por um conjunto de empresas, como JetBrains, Google, Netflix etc, esse grupo é chamado de Kotlin Fundation. MOTIVAÇÃO CRIAÇÃO KOTLIN
Android, dentro do Mercado Livre existem inúmeras iniciativas utilizando Kotlin no desenvolvimento backend, em várias verticais de negócio como Mercado Envios, Seller Invoice, Mercado Shops entre outras, são quase 200 projetos em Kotlin e 100 aplicações e serviços em produção. Vemos também um crescimento exponencial de novas aplicações sendo feitas em Kotlin.
Uber, Netflix etc) Constantemente atualizado Curva de aprendizado muito baixa para devs Java Sintaxe simples, concisa e pouco verbosa Interoperabilidade total com Java Múltiplos Paradigmas (Funcional, OO) Foco Imutabilidade Features Coroutines Data Class Default e Named Parameters Delegations Destructuring Declarations Elvis Operator Extension Function Infix Function Lazy Initialization Null Safety por padrão One Line Function Receiver Function Scope Function Sealed Class Smart Cast Operator overloading Template String Type Alias
JAVA é maior que a de Kotlin, sendo assim há mais material disponível para JAVA Kotlin não possuí operador ternário Velocidade de compilação inferior ao de JAVA Existem muitos desenvolvedores Kotlin no mercado, porém poucos especialistas Não possuí tipos primitivos Não possui membros estáticos
Java FEATURE INTEROPERABILIDADE TOTAL COM JAVA Uma das melhores características da linguagem de programação Kotlin é sua total interoperabilidade com Java, que atrai mais desenvolvedores de Java para aprender Kotlin e também sua baixa curva de aprendizado para desenvolvedores Java. Com essa total interoperabilidade conseguimos usar todas as ferramentas, frameworks e utilitários feitos em Java. Obs.: Isso pode ser visto em mais detalhes aqui.
sistema de tipos da linguagem Kotlin visa eliminar os perigos de referências nulas do código, que é frequentemente chamado de erro de bilhão de dólares. Por exemplo, em Java, o acesso a um membro de referência nula resulta em uma exceção de referência nula, já no Go um panic. Kotlin não compila código que atribui ou retorna um nulo. Isso é visto como uma das características mais importantes do Kotlin. Obs.: Isso pode ser visto em mais detalhes aqui. Não existe código Java equivalente para isso.
com variáveis nulas de maneira muito mais eficiente, também deixando o código muito mais limpo e legível. Obs.: Isso pode ser visto em mais detalhes aqui. Não existe essa feature no Java, mas no próximo slide podemos ver um código equivalente com IFs.
As String em Kotlin podem conter expressões de modelo. A expressão de modelo é um pedaço de código que é avaliado e seu resultado é concatenado em string. Começa com um cifrão $ e consiste em um nome de variável, caso queira executar algo dentro disso é só adicionar ${logica} Obs.: Isso pode ser visto em mais detalhes aqui.
do Kotlin, você pode adicionar funções às classes já existentes, sem fazer alterações diretamente em seu código fonte. Embora as funções de extensão sejam frequentemente criticadas, as vezes é muito útil. Isso nos permite resolver um método / propriedade estático em um objeto / classe que já existe. Ou seja, chamamos o objeto como se tivesse chamando o método ou classe de origem. Obs.: Isso pode ser visto em mais detalhes aqui. Não existe código Java equivalente para isso.
O escopo do recurso e a necessidade de uma classe são sempre discutidos pelos designers de linguagem de programação. Uma classe de dados típica em Java tem toneladas de código padrão que é necessário pular enquanto descobre o uso real dessa classe. No entanto, no Kotlin, você pode escrever o equivalente do mesmo código Java de uma maneira muito simples e economizar toneladas de digitação e esforço mental. Obs.: Isso pode ser visto em mais detalhes aqui.
Os parâmetros padrão no Kotlin são bastante úteis quando você passa os argumentos por nome, em vez de índice. Outra grande vantagem também quando é necessário adicionar um parâmetro em uma função já existente e não gostaríamos de quebrar quem já utiliza essa função. Obs.: Isso pode ser visto em mais detalhes aqui.
poderosos em combinação com parâmetros nomeados. Também melhoram a leitura do código de quem está chamando a função. Obs.: Isso pode ser visto em mais detalhes aqui. Não existe código Java equivalente para isso.
boa alternativa à herança de implementação, e o Kotlin o suporta nativamente, exigindo zero código padrão, isso é muito útil em casos de uso, qual usamos uma estrutura de camada onde Endpoint > Service > Dão e normalmente em alguns métodos o service apenas delega a chamada para o Dao, porque o mesmo não possui nenhuma lógica. Obs.: Isso pode ser visto em mais detalhes aqui. Código de exemplo Java equivalente
lambda e funções anônimas são 'literais de função', isto é, funções que não são declaradas, mas são transmitidas imediatamente como expressão. Kotlin é considerado por muitos uma linguagem com uma sintaxe lambda muito intuitiva e concisa. Obs.: Isso pode ser visto em mais detalhes aqui.
Há duas formas de fazer casting de valores de variáveis em Kotlin: explicitamente e de forma automática. O compilador Kotlin buca a palavra reservada "is" e identifica valores imutáveis para fazer o casting automaticamente. Obs.: Isso pode ser visto em mais detalhes aqui.
declarar seu tipo de retorno; uma exceção existe apenas para funções que consistem em uma única expressão. Freqüentemente, são chamadas de funções de one line ou de single line. Essas funções podem usar uma sintaxe abreviada que omite as chaves e usa o = símbolo antes da expressão em vez da return. Esse recurso deixa o código bastante legível. Obs.: Isso pode ser visto em mais detalhes aqui. Não existe código Java equivalente para isso.
várias funções cujo único objetivo é executar um bloco de código no contexto de um objeto. Quando você chama essa função em um objeto com uma expressão lambda fornecida, ela forma um escopo temporário. Nesse escopo, você pode acessar o objeto sem seu nome. Tais funções são chamadas de funções de escopo . Há vários deles, como: let, run, with, apply, e also. Basicamente, essas funções fazem o mesmo: execute um bloco de código em um objeto. O que é diferente é como esse objeto fica disponível dentro do bloco e qual é o resultado de toda a expressão. Obs.: Isso pode ser visto em mais detalhes aqui. Não existe código Java equivalente para isso.
A expressão when substitui o famoso switch operator de linguagens baseadas em C. when checa o argumento de entrada contra todas as opções sequencialmente até que alguma seja verdadeira. when pode ser usado ou como uma expressão ou como uma declaração. A opção else é executada se nenhuma das outras opções são verdadeiras. Se when é utilizado como uma expressão, a opção else é obrigatório, a não ser que o compilador tenha certeza que todos os casos estão cobertos pela opção (como por exemplo com um enum) Obs.: Isso pode ser visto em mais detalhes aqui.
Às vezes, precisamos construir objetos que tenham um processo de inicialização complicado. Além disso, muitas vezes não podemos ter certeza de que o objeto pelo qual pagamos o custo da inicialização no início de nosso programa será usado em nosso programa. Pensando nisso a equipe do Kotlin desenvolveu o conceito de "inicialização lenta" para impedir a inicialização desnecessária de objetos. Essa feature faz parte de um conjunto de features chamadas Delegated Properties. Obs.: Isso pode ser visto em mais detalhes aqui.
temos a possibilidade de escrever os nomes das funções de qualquer forma desde que esteja dentro de crases, isso é muito utilizado no escopo de teste. Obs.: Isso pode ser visto em mais detalhes aqui. Não existe código Java equivalente para isso.
functions; Devem conter apenas um único parâmetro; O parâmetro não pode ser um vararg and não pode conter um default value; Funções marcadas com o keyword infix também podem ser chamadas usando a notação infix (omitindo o ponto e os parênteses na chamada). Funções infix devem satisfazer os seguintes requerimentos: Obs.: Isso pode ser visto em mais detalhes aqui. Não existe código Java equivalente para isso.
Há casos em que precisamos criar nomes alternativos para tipos já existentes. Isso pode acontecer caso o nome é muito grande e vamos utilizar muito durante nossa implementação, por exemplo. Kotlin permite criar alias para tipos utilizando a palavra chave typealias. Obs.: Isso pode ser visto em mais detalhes aqui.
representar hierarquias de classe restritas, quando um valor pode ter um dos tipos de um conjunto limitado, mas não pode ter nenhum outro tipo. Elas são, de certa forma, uma extensão de classes de enum: o conjunto de valores para um tipo de enum também é restrito, mas cada constante de enum existe apenas como uma única instância, enquanto uma subclasse de uma classe selada pode ter várias instâncias que podem conter Estado. Obs.: Isso pode ser visto em mais detalhes aqui.
são usadas para representar hierarquias de classe restritas, quando um valor pode ter um dos tipos de um conjunto limitado, mas não pode ter nenhum outro tipo. Elas são, de certa forma, uma extensão de classes de enum: o conjunto de valores para um tipo de enum também é restrito, mas cada constante de enum existe apenas como uma única instância, enquanto uma subclasse de uma classe selada pode ter várias instâncias que podem conter Estado.
Generics Object Expressions Inline Classes Inline Functions Ranges and Progressions Type-Safe Builders e DSLs Function Receiver Equality OUTRAS FEATURES A SEREM ESTUDADAS
backend - Usado pela iniciativa Mercado Envios/FOS Automation e Mercado Envios/YMS Projeto de exemplo referência em Kotlin no Fury Grupo de estudos Kotlin - Vídeos e códigos do grupo de estudos Kotlin Guia de motivação para o uso de Kotlin - Esse documento foi usado para justificar o uso de Kotlin no backend das aplicações do time YMS e UCS Coding Conventions - Convenção de código Kotlin da própria linguagem Post - Idiomatic Kotlin, Best Practices - Um post sobre boas práticas de Kotlin Effective Kotlin - Livro sobre boas práticas em Kotlin Projeto de exemplo Kotlin Rest (Kotlin v.1.2) Projeto de exemplo Kotlin GraphQL (Kotlin v.1.2) Exemplo de um problema resolvido em Kotlin, Java e Golang Acessível somente a membros do Mercado Livre