Escolar Documentos
Profissional Documentos
Cultura Documentos
1 1
1 1
Programando Kotlin
Criando elegante, expressivo e de alto desempenho
Aplicativos JVM e Android
Copyright © 2019 The Pragmatic Programmers, LLC. Este livro é licenciado para o indivíduo que o comprou. Não o
protegemos contra cópia porque isso limitaria sua capacidade de usá-lo para seus próprios fins. Por favor, não
quebre essa confiança – você pode usar isso em todos os seus dispositivos, mas não compartilhe esta cópia com
outros membros da sua equipe, com amigos ou por meio de serviços de compartilhamento de arquivos. Obrigado.
Muitas das designações utilizadas pelos fabricantes e vendedores para distinguir os seus produtos são reivindicadas como
marcas comerciais. Onde essas designações aparecem neste livro, e a The Pragmatic Programmers, LLC estava ciente
de uma reivindicação de marca registrada, as designações foram impressas em letras maiúsculas ou em letras maiúsculas.
The Pragmatic Starter Kit, The Pragmatic Programmer, Pragmatic Programming, Pragmatic Bookshelf e o dispositivo g de
ligação são marcas registradas de The Pragmatic Programmers, LLC.
Todas as precauções foram tomadas na preparação deste livro. No entanto, o editor não assume nenhuma
responsabilidade por erros ou omissões, ou por danos que possam resultar do uso das informações (incluindo
listagens de programas) aqui contidas.
Nossos cursos, workshops e outros produtos Pragmatic podem ajudar você e sua equipe a criar softwares
melhores e a se divertir mais. Para obter mais informações, bem como os títulos mais recentes da Pragmatic, visite-nos
em http://pragprog.com.
Nossos e-books não contêm nenhum gerenciamento de restrições digitais e sempre foram livres de DRM. Fomos pioneiros
no conceito de livro beta, onde você pode comprar e ler um livro enquanto ele ainda está sendo escrito e fornecer feedback
ao autor para ajudar a criar um livro melhor para todos. Recursos gratuitos para todos os compradores incluem
downloads de código-fonte (se aplicável), erratas e fóruns de discussão, todos disponíveis na página inicial do livro em
pragprog.com. Estamos aqui para facilitar sua vida.
Quer ficar por dentro de nossos títulos e anúncios mais recentes e ofertas especiais ocasionais? Basta criar uma conta
em pragprog.com (basta um endereço de e-mail e uma senha) e marque a caixa de seleção para receber boletins
informativos. Você também pode nos seguir no Twitter como @pragprog.
Se você comprar diretamente de pragprog.com, você obtém e-books em todos os formatos disponíveis por um preço
único. Você pode sincronizar seus e-books entre todos os seus dispositivos (incluindo iPhone/iPad, Android,
laptops, etc.) via Dropbox. Você recebe atualizações gratuitas durante toda a vida da edição. E, claro, você sempre pode
voltar e baixar novamente seus livros quando necessário. Os e-books comprados na loja Kindle da Amazon estão
sujeitos às políticas da Amazon. As limitações no formato de arquivo da Amazon podem fazer com que os e-books
sejam exibidos de maneira diferente em dispositivos diferentes. Para obter mais informações, consulte nosso
FAQ em pragprog.com/frequently-asked-questions/ebooks. Para saber mais sobre este livro e
acessar os recursos gratuitos, acesse https://pragprog.com/book/vskotlin, a página inicial do livro.
Andy Hunt
Os programadores pragmáticos
Índice
Prefácio
Agradecimentos
Introdução
Para quem é este livro?
1. Olá Kotlin
Razões para amar Kotlin
Empacotando
Menos digitação
Avisos sensatos
Prefira val a var
Modelos de string
Cordas brutas
Empacotando
vararg e spread
Desestruturação
Empacotando
iteração de iteração
Empacotando
5. Usando coleções
Sabores de Coleções
Usando lista
Usando Conjunto
Usando Mapa
Machine Translated by Google
Empacotando
de Qualquer e Nada
Referências anuláveis
Empacotando
Objetos
Classes Genéricas
Classes de dados
Empacotando
Herança
Aulas Seladas
Empacotando
Machine Translated by Google
Delegando a um Parâmetro
Conclusão
Expressões Lambda
Empacotando
Iteradores Internos
Empacotando
Machine Translated by Google
Estendendo Funções
Receptores Implícitos
Empacotando
Empacotando
Empacotando
Machine Translated by Google
Depurando corrotinas
assíncronas e aguardando
Uma espiada nas continuações
Empacotando
Empacotando
Zombando Dependências
Empacotando
Criando um controlador
Criando um serviço
Empacotando
Implementando a Atividade
Atualizando o RecyclerView
Vendo o aplicativo em ação
Empacotando
A2. Kotlin/nativo
Bibliografia
ÿHadi Hariri
Este livro abrirá as portas para o incrível mundo de Kotlin. Você será guiado ao longo
desta jornada por um dos mais famosos oradores e educadores de nossos dias. Tenha um
bom Kotlin!
Entre na caverna de Kotlin usando este excelente livro como farol. Ganhe confiança nesta
bela linguagem enquanto um explorador de cavernas ganha autoconfiança ao encontrar seu
caminho em uma caverna recém-explorada nunca antes vista pelos olhos humanos. Explore
pragmaticamente cada vez mais profundamente esta linguagem JVM moderna usando o
conhecimento, dicas e diretrizes fornecidas por um entusiasta extraordinário e
experiente em linguagem de programação: Venkat.
ÿTom Adam
A maneira envolvente e bem-humorada de explicar as coisas, como Venkat faz em suas palestras, também é
exibida neste livro. É um guia muito bem estruturado e de fácil leitura para todos que estão — ou desejam
ÿBrian Vermeer
Realmente um livro perfeito para começar a trabalhar, e não apenas ouvir sobre o
hype do Kotlin. Na verdade, isso explicou qual é o burburinho sobre Kotlin. Venkat fez
isso mais uma vez! Um livro de leitura obrigatória, não apenas para começar a usar
Kotlin, mas também para comparar o que está faltando em Java.
ÿ Zulfikar Dharmawan
Kotlin é uma nova linguagem muito promissora, e Venkat usa seu conhecimento, humor
e clara admiração por Kotlin para criar um livro muito legível e educativo. Venkat
explica as coisas muito bem, dá conselhos úteis e até dá risadas ocasionais.
ÿTory Zundel
Arquiteto de software
ÿ Ashish Bhatia
Se você está satisfeito com Java e não vê necessidade de travessia segura para nulos
ou delegação de primeira classe, então largue este livro; você não está pronto. Caso
contrário, leia este livro. Você será entretido e educado simultaneamente.
ÿ Daniel DeGroff
CTO, FusionAuth
Machine Translated by Google
Prefácio
Com este livro, você aprenderá Kotlin. Em nome da equipe Kotlin eu digo: seja bem vindo!
Em 2010, quando iniciamos o Kotlin, pensamos nele como uma ferramenta para
desenvolvedores Java, permitindo que eles construíssem o que quisessem com facilidade e
prazer. Apostamos na segurança de tipo para excelente ferramental e detecção precoce de
erros de programação. Apostamos na interoperabilidade com Java para dar a todos os
desenvolvedores Kotlin acesso ao vasto ecossistema Java. Hoje em dia, Kotlin é uma
linguagem multiplataforma que pode rodar em um servidor rodando JVM, em um dispositivo
Android, em um navegador web, em um dispositivo iOS ou em uma máquina
Linux ou até mesmo em um microcontrolador. Mesmo assim, nossos princípios permaneceram
os mesmos: permitimos que as pessoas construíssem software com facilidade e prazer e
apostamos em ferramentas, interoperabilidade com todas as plataformas e na detecção precoce de erros.
O desenvolvimento da linguagem tem vários estágios. Primeiro você só tem uma ideia, e nessa
fase eu estava cheio de dúvidas e ao mesmo tempo com muita vontade de experimentar.
Pode-se chamar isso de fé, talvez. Então você tem seu primeiro programa compilado e
executado. Está começando a tomar forma. Então cresce. Então você resolve muitos problemas.
E mais problemas. Então, se você tiver sorte, alguém de fora da sua equipe ficará entusiasmado
com o seu idioma e você estará no paraíso. Os primeiros usuários vêm e fornecem feedback.
Depois, mais problemas e muitas dúvidas: estamos prontos para lançar? Então você
simplesmente não pode esperar mais, você dobra e lança 1.0. Você comemora brevemente
e corre para corrigir todos os problemas relatados pelos novos usuários. O tempo passa, o
ecossistema cresce, a equipe cresce, mais usuários, algumas novidades, novos lançamentos,
mais
Machine Translated by Google
Como este livro pressupõe algum conhecimento de Java, você começará onde
começamos e, quando chegar ao final do livro, terá uma visão muito boa da
linguagem e de suas aplicações práticas no mundo JVM e no Android. Você saberá
como fazer o que quiser com Kotlin e como ele pode ajudá-lo. Meu objetivo como
designer de linguagem é tornar o Kotlin útil para você, e Venkat fez um ótimo trabalho
ao tornar seu aprendizado agradável.
Andrei Breslav
Designer-chefe do Kotlin
Julho, 2019
Agradecimentos
Gostaria de expressar meu mais profundo respeito e gratidão à equipe Kotlin, aos
desenvolvedores da JetBrains que estão trabalhando incansavelmente em diferentes
partes da linguagem e ferramentas relacionadas. Sempre soube que eles eram muito
inteligentes, mas uma breve visita com eles me mostrou também o quão receptivos,
interessados e meticulosos eles são em aprender sobre o uso da língua na natureza,
para que possam aprimorá-la. Obrigado, equipe, continuem com seu trabalho duro; o
que você faz é sinceramente apreciado.
Nada disso teria sido possível sem o apoio, incentivo e paciência da minha família. Sou
grato à minha esposa Kavitha e aos meus filhos Karthik e Krupa. Agora que terminei
este livro, deveria ter mais tempo para piadas de pai.
Introdução
Aprender um idioma é como visitar uma cidade. Você encontra coisas novas, mas também
vê coisas que são comuns. O que é familiar traz conforto e as diferenças intrigam. Para
ter sucesso no aprendizado de um idioma, precisamos de um bom equilíbrio entre os dois.
Quando comecei a aprender Kotlin minha mente estava em chamas, vendo os recursos
que gostei em diferentes linguagens como Java, Groovy, Scala, C++, C#, Ruby, Python,
JavaScript, Erlang, Haskell… Ao mesmo tempo, existem tantas nuances em Kotlin que me
tornaram muito mais produtivo em programação do que qualquer uma dessas
linguagens.
Algumas linguagens dizem como você deve escrever código. Kotlin não é um desses.
Com o Kotlin, você decide qual paradigma funciona melhor para o aplicativo
em questão. Por exemplo, você pode descobrir que o estilo imperativo é melhor em um
aplicativo grande porque você precisa lidar com efeitos colaterais e exceções
inerentes, e o Kotlin facilita a programação nesse estilo.
Machine Translated by Google
Mas, em outra parte do aplicativo, você pode precisar lidar com transformações
de big data, então você decide que o estilo funcional é melhor para isso, e o
Kotlin se transformará instantaneamente em uma charmosa linguagem de
programação funcional. Ao escrever código orientado a objetos, você verá que
o compilador funciona para você, em vez de você trabalhar para o compilador.
Você verá meu entusiasmo pelo idioma ao longo deste livro. Foi divertido
aprender e aplicar Kotlin. Espero que este livro torne sua jornada para aprender
o idioma agradável. Obrigado por atender.
Machine Translated by Google
Se você é novo no Kotlin, este livro o ajudará a começar e avançar rapidamente com a
aplicação da linguagem em seus projetos. Se você já usa Kotlin, poderá usar este livro
para obter uma compreensão mais profunda de alguns dos recursos avançados da
linguagem.
Você também pode usar este livro para treinar seus desenvolvedores para se tornarem
proficientes em Kotlin, para usá-lo para criar código altamente fluente e expressivo e para
resolver problemas complexos.
Machine Translated by Google
Os programadores vindos do Java para o Kotlin têm algumas práticas e sintaxe para
desaprender antes de começarem a aprender o que há de novo e diferente no Kotlin.
Abordaremos isso no Capítulo 2, Kotlin Essentials for the Java Eyes.
As funções são cidadãs de primeira classe em Kotlin, e a linguagem tem muito a oferecer,
como argumentos padrão e nomeados e varargs. Explore esses recursos
relacionados a funções no Capítulo 3, Trabalhando com funções.
Kotlin tem um sistema de tipo de som e sua verificação de tipo em tempo de compilação
vai além do que esperamos de linguagens de tipo estaticamente. No Capítulo 6,
Segurança de tipo para salvar o dia, veremos os tipos fundamentais do Kotlin, referências
anuláveis e não anuláveis, conversões inteligentes, variação genérica e muito mais.
Como uma das linguagens que tem suporte direto para delegação, o Kotlin fornece
alguns delegados integrados e também facilita a criação de delegados personalizados.
Começaremos com uma discussão sobre quando e por que usar a delegação e depois nos
aprofundaremos no uso de delegados no Capítulo 9, Extensão por meio da
delegação.
No Capítulo 10, Programação Funcional com Lambdas, você aprenderá como criar
expressões lambda e como escrever funções de ordem superior. Também abordaremos
os recursos oferecidos em Kotlin para eliminar a sobrecarga de chamadas de função e
melhorar o desempenho.
O Capítulo 12, Fluência em Kotlin, mostrará muitos dos recursos do Kotlin para criar
código conciso, fluente, elegante e expressivo.
O Capítulo 13, Criando DSLs Internas, baseia-se no tópico de fluência para criar DSLs
internas, para definir sua própria sintaxe para sua linguagem especializada, mas com total
segurança de tipo em tempo de compilação.
Kotlin é uma das poucas linguagens na JVM que fornece otimização de chamada
final. Veremos isso em ação no Capítulo 14, Programando Recursão e
Memoização, junto com o uso da memoização para reduzir a complexidade
computacional.
Kotlin pode ser executado em diferentes plataformas, incluindo a Java Virtual Machine.
No Capítulo 17, Misturando Java e Kotlin, você aprenderá como misturar Kotlin com
Java; como usar Kotlin em versões modernas de Java — ou seja, com módulos Java;
como usá-lo com Maven e Gradle; e também como trabalhar perfeitamente com Java e
Kotlin no mesmo aplicativo.
Mesmo que o compilador Kotlin detecte vários erros, o teste automatizado é uma
prática essencial para o desenvolvimento ágil sustentável. Você aprenderá como criar
testes unitários e medir a cobertura de código no Capítulo 18, Testes unitários com
Kotlin.
Finalmente, no Capítulo 20, Escrevendo aplicativos Android com Kotlin, usaremos Kotlin para criar um
Para economizar espaço, a saída de um trecho de código é mostrada como uma linha de
comentário na mesma linha do comando println() sempre que possível ou na próxima linha.
Ocasionalmente, uma linha de comentário diz algo sobre o código em vez de mostrar o
resultado esperado.
Machine Translated by Google
Recursos online
Este livro tem uma página oficial[1] no site Pragmatic Bookshelf. A partir daí você pode
baixar todo o código-fonte de exemplo do livro. Você também pode fornecer comentários
enviando entradas de erratas.
Se estiver lendo o livro em formato PDF, você pode clicar no link acima de uma lista
de códigos para visualizar ou baixar os exemplos específicos.
Notas de rodapé
[1]
http://www.pragprog.com/titles/vskotlin
Capítulo 1
Olá Kotlin
Ah, Kotlin – é uma ilha perto de São Petersburgo, na Rússia, mas este livro é sobre
sua linguagem de programação homônima. Os programadores que usam Kotlin não
gostam apenas da linguagem – eles dizem que a adoram. Quais são os motivos desse
carinho? Essa é a pergunta com a qual começaremos rapidamente. Em seguida, iremos
instalar o Kotlin Software Developer Kit (SDK), escrever algum código, compilá-lo e executá-
lo para que possamos vê-lo funcionando.
Imagine pegar o melhor de muitas linguagens diferentes – C++, C#, Erlang, Groovy,
Java, JavaScript, Python, Ruby, Scala, Smalltalk – jogá-las em um liquidificador e ligá-lo;
o coquetel resultante é Kotlin. A força do Kotlin está na sua diversidade.
O maior aumento no interesse pelo Kotlin veio logo após o anúncio do Google de
que o Kotlin é uma linguagem oficial para o desenvolvimento do Android.
[4] O endosso do Google é certamente significativo, mas há mais motivos para estar
entusiasmado com o Kotlin.
Kotlin é uma das poucas linguagens que podem ser usadas para desenvolvimento
do lado do servidor, móvel/Android e front-end. O código, escrito apropriadamente, pode ser
compilado em bytecode Java ou pode ser transpilado (compilado do código-fonte de uma
linguagem para o código-fonte de outra linguagem) para JavaScript. Kotlin/Native oferece
suporte a plataformas de destino, incluindo iOS, macOS, Linux, Windows e WebAssembly,
para compilar seu código-fonte em binários nativos. Isso torna o Kotlin uma das poucas
linguagens que você pode usar para desenvolvimento full-stack.
Ao viajar pelo Kotlin, você poderá reconhecer vários desses recursos e traçar suas raízes:
Sem herdar de uma classe, você pode adicionar seus próprios métodos de
conveniência específicos de domínio às classes. Esses métodos, chamados de
funções de extensão, podem ser usados como métodos que fazem parte da classe
original, com suporte total ao ambiente de desenvolvimento integrado (IDE). É como
os métodos de extensão no estilo C# no Kotlin, embora o Kotlin tenha recursos muito
mais ricos.
A delegação costuma ser uma ferramenta de design melhor do que a herança para reutilizar código.
Kotlin, inspirado em linguagens como Groovy e Ruby, é versátil nas maneiras como você
pode delegar chamadas de método de um objeto para outro, sem comprometer
a segurança de tipo.
Estender funções e métodos existentes é fácil em Kotlin (embora exija recompilação devido
à incompatibilidade binária), graças aos recursos de seus parâmetros padrão,
semelhantes a JavaScript, Scala, Ruby e Python.
Onde fizer sentido, você pode sobrecarregar operadores em suas próprias classes
ou em classes de terceiros, assim como em linguagens como C++ e Groovy.
A elegância, fluência e natureza concisa do Kotlin se unem para suportar a criação de DSLs
internas, semelhantes a linguagens como Groovy e Ruby, mas com suporte total para
verificação de tipo estático.
Esses são apenas alguns dos recursos importantes que são proeminentes no Kotlin.
Machine Translated by Google
Programação Multiparadigma
Kotlin nos trata como adultos, oferece opções e nos permite escolher a abordagem mais
adequada para o problema em questão. A língua tem poucas cerimônias;
você não é obrigado a escrever tudo nas classes nem a compilar cada parte do código.
A linguagem é em grande parte sem opinião e oferece diferentes paradigmas
de programação para você escolher ou até mesmo misturar.
Assim como em Java, você pode criar classes e escrever código orientado a objetos em
Kotlin, mas sem muito código clichê. Portanto, é necessário menos código para
obter os mesmos resultados que em Java. Kotlin orienta você na criação de sua
hierarquia de classes intencionalmente, e não acidentalmente. As classes são finais por
padrão e se você pretende que uma classe sirva como classe base, você deve
especificar isso explicitamente. Além disso, a delegação possui uma sintaxe no nível da
linguagem, portanto podemos selecionar com prudência entre herança e delegação.
Você pode fazer uso imediato da elegância e da cerimônia baixa da sintaxe Kotlin para
criar linguagens internas específicas de domínio (DSLs). Além de criar suas próprias
APIs fluentes, você também pode se beneficiar da fluência em diversas bibliotecas
diferentes, por exemplo, a API Kotlin para a estrutura Spring.[5]
Além de programar simultaneidade usando o Java Development Kit (JDK), você também
pode escrever programas assíncronos usando as corrotinas do Kotlin. Esse
recurso é fundamental para aplicações que utilizam serviços em nuvem ou são
implantadas como microsserviços; permite interagir de forma eficiente com
outros serviços para trocar dados de forma assíncrona.
Kotlin também transpila para JavaScript. Você pode escrever código Kotlin que pode ser
transformado em JavaScript e executado em Node.js no lado do servidor ou em navegadores
no front-end da web.
Usando Kotlin/Native, você pode compilar código em binário nativo para execução
em plataformas específicas e em WebAssembly para execução em navegadores.
Fluente e elegante
Algumas linguagens impõem grande cerimônia e forçam você a criar código padrão. Alguns
desenvolvedores argumentam que os IDEs eliminam o fardo de ter que escrever esse
código manualmente. É verdade, mas mesmo que os IDEs vomitassem isso
Machine Translated by Google
código padrão, sua equipe precisa gastar tempo e esforço mantendo esse código
todos os dias. Linguagens como Scala, Groovy e Ruby sintetizam código que os
programadores terão que escrever. Da mesma forma, Kotlin cria algumas
coisas para você, como campos, getters e setters, seguindo implicitamente a
convenção JavaBean. Menos esforço, melhores resultados.
Kotlin torna algumas coisas opcionais. Por exemplo, um ponto e vírgula é opcional.
Não tendo que colocar o ; O símbolo leva a uma sintaxe mais fluente – essencial
para a criação de DSLs internas de fácil leitura. Kotlin também fornece uma anotação
infixa que podemos usar, tornando o ponto e os parênteses opcionais. Com
esses recursos você pode escrever código fluente e elegante como este:
Sim, não é ficção - é código Kotlin real; você aprenderá a criar seu próprio código
fluente como este posteriormente neste livro, sem a necessidade de analisadores
ou ferramentas externas.
Machine Translated by Google
Kotlin oferece muito mais segurança em tempo de compilação quando comparado a muitas
outras linguagens de tipo estaticamente. O código que você escreve falhará menos e
falhará rapidamente – durante a compilação, e não no tempo de execução. Esta é uma
das razões pelas quais a equipe do Spring[6] decidiu adotar o Kotlin.
Alguns dos recursos programados para aparecer em versões futuras do Java já estão no
Kotlin. Você pode experimentar e se beneficiar do Java futuro agora mesmo usando
o Kotlin.
Você pode misturar código Kotlin e Java em seus projetos – usar Kotlin não é uma proposta
de tudo ou nada.
Você pode não apenas usar sintaxe fluente semelhante a DSL para interagir com APIs, como
na API Spring Kotlin, mas também projetar suas próprias APIs para serem fluentes e
expressivas para programadores que usam seu código.
Machine Translated by Google
Você pode reduzir a duplicação entre partes do seu sistema com Kotlin.
Por exemplo, as mesmas regras de negócios que verificam a entrada dos usuários
podem ser compiladas para bytecode Java para validações de back-end,
transpiladas para JavaScript para validação de front-end, compiladas para binários
nativos para execução em plataformas específicas como iOS e Android, ou para
WebAssembly para ser executado em navegadores.
Por fim, Kotlin é uma ótima opção para desenvolvimento Android, pois é a linguagem
oficial dessa plataforma.
Você verá mais sobre por que Kotlin é interessante nas muitas páginas deste livro. Apertem
os cintos – vai ser um passeio divertido. Vamos começar instalando o SDK para que possamos
começar a escrever Kotlin.
Machine Translated by Google
Depois de digitar seu código, o Kotlin oferece uma variedade de opções para executar
o código. Ao contrário do Java, você não precisa compilar cada linha de código. Você pode
executar o código como está, diretamente do código-fonte em um arquivo, se desejar.
Como alternativa, você pode criar arquivos de classe e reutilizar o binário para
executar outras classes ou arquivos Kotlin. Enquanto estiver escrevendo o código, você
pode iniciar o shell Kotlin para experimentar o comportamento de um pequeno trecho de
código. Você pode executar seu código na JVM, em um mecanismo JavaScript no
Node.js ou no navegador, ou em dispositivos Android, e também pode executá-lo
em destinos nativos como iOS e WebAssembly.
São muitas opções, mas antes de podermos exercer qualquer uma delas, precisamos do
SDK, então vamos instalá-lo primeiro.
Mas mesmo que todos nós usemos IDEs, é bom começar aprendendo como
compilar e executar na linha de comando, pois isso lhe dá total exposição à
construção do código. Instale o compilador independente no link Baixar compilador
do site Kotlin. Isso o levará à página Trabalhando com o Compilador de Linha de
Comando.[8] Você pode baixar e descompactar os arquivos zip para instalar, usando
Homebrew ou uma das outras opções,
Machine Translated by Google
dependendo do seu sistema operacional. Você também precisará do JDK 1.6[9] ou posterior
em seu sistema.
Verifique a instalação
Depois de instalar e definir o caminho para onde o Kotlin está instalado, verifique se tudo
está definido executando o seguinte comando:
$ kotlinc-jvm -versão
A saída desse comando, se o Kotlin tiver sido instalado corretamente, mostrará o número
da versão, assim:
Não se preocupe com a versão específica do JRE na saída. A saída que você verá no seu
sistema refletirá a versão do Java que você já instalou.
Depois de verificar a instalação, passe para a próxima etapa para escrever um pequeno
trecho de código Kotlin e executá-lo.
Machine Translated by Google
Vamos primeiro criar um pequeno programa Hello World em Kotlin. Usando seu editor de texto
favorito, crie um arquivo chamado Hello.kt, assim:
correndo/Hello.kt
Não se preocupe com a sintaxe do código neste momento; vamos manter nosso foco em fazer o
código rodar. Discutiremos a sintaxe e a semântica da linguagem nos capítulos seguintes. Você
pode especificar o parâmetro para a função main() se desejar, mas a partir do Kotlin 1.3, isso é
opcional. Se você estiver usando uma versão anterior à 1.3, você precisará adicionar o
parâmetro, assim: fun main(args:
Matriz<String>).
Este comando irá compilar o código do arquivo Hello.kt no bytecode Java e colocá-lo no
arquivo Hello.jar .
Depois que o arquivo jar for criado, execute o programa usando a ferramenta java , assim:
Como o arquivo Hello.kt contém apenas a função principal e não uma classe, o compilador
Kotlin, kotlinc-jvm, cria automaticamente uma classe com o nome do arquivo, sem a extensão .kt ,
mas adiciona um sufixo Kt .
Olá Mundo
Em vez de especificar a opção de linha de comando classpath , você também pode usar
a opção jar para executar o código. Isso porque, ao encontrar a função main() , o
compilador Kotlin decidiu adicionar o atributo de manifesto Main-Class ao arquivo jar. Vá
em frente e experimente o seguinte comando no arquivo Hello.jar :
A saída deste comando será a mesma produzida quando a opção classpath foi usada
em vez da opção jar .
Em vez de usar a ferramenta java , você também pode usar a ferramenta kotlin . Nesse caso, você
Aqui estão os passos, mas você pode pular o primeiro passo; é o mesmo comando de
compilação de antes:
A saída do código será a mesma, quer executemos o código usando a ferramenta java ou a
ferramenta kotlin .
Executando em IDEs
Não deve ser surpresa que o IntelliJ IDEA da JetBrains, que também é a empresa por trás do
Kotlin, tenha excelente suporte para programação com a linguagem. Alguns
desenvolvedores acham que precisam desse IDE para usar Kotlin, mas isso não é verdade.
Kotlin não exige que você use um IDE específico ou qualquer IDE.
Kotlin vem com as versões mais recentes do IntelliJ IDEA e também com o
Edição da comunidade IntelliJ IDEA gratuita e de código aberto. Para usar o IntelliJ
IDEA para desenvolvimento com Kotlin, comece criando um projeto Kotlin. Depois de criar um
projeto, você pode criar rapidamente arquivos Kotlin e executá-los com apenas alguns cliques
do mouse ou atalhos de teclado. O breve tutorial[11] no site oficial do idioma lhe dará um
início rápido se você ficar preso em alguma etapa.
Se você é um aficionado pelo Eclipse, pode usar o Eclipse Neon ou posterior para programar
com Kotlin. O site oficial da linguagem Kotlin também tem um tutorial para Eclipse,[12] para
ajudá-lo a começar a usar Kotlin no Eclipse.
Verifique se você está usando a versão correta do IDE e a versão correta do Kotlin
compatível com essa versão.
Experimente o REPL
Machine Translated by Google
Várias linguagens fornecem um shell de linha de comando read-evaluate-print loop (REPL) para
executar pequenos trechos de código. Gosto de chamá-los de ferramentas de
microprototipagem. Quando você está no meio da codificação ou da aprovação do
seu teste automatizado atual, em vez de se perguntar o que uma função específica faz, você
pode rapidamente dar um passeio no REPL. Depois de verificar se um pequeno trecho de
código é o que você está procurando, você pode usar a melhor ferramenta que os humanos
inventaram – copiar e colar – para trazê-lo do REPL para o seu editor ou IDE. A ferramenta
interativa também é muito útil para mostrar a um colega como funciona um pequeno trecho
de código, sem a necessidade de criar um projeto em um IDE, por exemplo.
$ kotlinc-jvm
Bem-vindo ao Kotlin ...
Digite :help para obter ajuda, :quit para sair
>>> 7 + 5
res0: kotlin.Int = 12 >>> val
list = listOf(1, 2, 3) >>> list.map { it * 2 }
res2:
kotlin.collections.List<kotlin.Int> = [2, 4, 6]
>>>
$
Assim que você digitar um trecho de código e pressionar a tecla Enter , o REPL avaliará esse
trecho de código, exibirá a resposta e solicitará o próximo trecho. Quando terminar,
pressione ctrl+d (ctrl+c no Windows) ou digite :quit para encerrar a sessão REPL.
De dentro do REPL, você também pode carregar arquivos existentes para executar código
neles. Por exemplo, vamos carregar o arquivo Hello.kt que criamos anteriormente e executá-lo
Machine Translated by Google
$ kotlinc-jvm
Bem-vindo ao Kotlin ...
Digite :help para obter ajuda, :quit para sair
>>> :load Hello.kt >>>
main()
Olá Mundo
>>>
$
Você também pode especificar o caminho de classe para seus próprios arquivos jar ou
arquivos jar de terceiros ao iniciar o REPL. Em seguida, você também pode usar instâncias de
suas classes ou classes de terceiros do REPL de forma interativa.
Você viu anteriormente como compilar o código Kotlin em bytecode, criar um arquivo jar e, em
seguida, executar o código usando os comandos java ou kotlin . Esse processo de duas etapas
é útil quando você tem vários arquivos em um aplicativo grande.
Mas nem tudo o que escrevemos é de grande porte ou em escala empresarial – scripts de
shell e arquivos em lote têm seu lugar.
Para executar algumas tarefas de back-end, analisar alguns arquivos, copiar arquivos com base em
alguma configuração – em outras palavras, para coisas que você normalmente usaria scripts de shell
– você pode escrever um script usando Kotlin. A vantagem de fazer isso é que você não precisa se
lembrar dos comandos shell entre sh, zsh, bash, Windows CMD, PowerShell e assim por
diante. E você pode usar uma linguagem poderosa e fluente para realizar as tarefas. Depois de
implementar a tarefa desejada em Kotlin, você pode executá-la como script, em uma única etapa,
em vez de compilar explicitamente o código para criar bytecode.
Se o código tiver um erro de sintaxe, a execução do script falhará sem realmente executar
qualquer parte do script; portanto, é tão seguro executar um script quanto compilar e executar.
Machine Translated by Google
Vamos escrever um script Kotlin para listar todos os arquivos com extensão kts no diretório
atual. Aqui está o código para isso:
executando/listktsfiles.kts
O conteúdo do arquivo não é diferente de um arquivo Kotlin normal que você escreveria. A
única diferença está no nome do arquivo, a extensão kts – para indicar a intenção de executar
como um script – em vez da extensão kt .
O código usa a classe File do pacote JDK java.io e também usa as funções de extensão que
Kotlin adicionou a essa classe. Ele percorre todos os arquivos no diretório atual (.) , filtra ou
seleciona apenas os arquivos que terminam com a extensão kts e imprime o objeto de arquivo
– ou seja, o caminho completo e o nome de cada arquivo selecionado.
Para executar este arquivo, usaremos o comando kotlinc-jvm , mas desta vez, em vez de
compilar, pediremos à ferramenta para executar o código como script imediatamente. Para isso,
use a opção -script , assim:
./listktsfiles.kts
Em sistemas do tipo Unix, se você deseja executar o script sem prefixar com kotlinc-jvm
-script, então você pode usar o recurso shebang, assim:
correndo/greet.kts
println( "oi")
Machine Translated by Google
$ ./greet.kts
oi
Em alguns sistemas, você deve fornecer o caminho completo para o local do kotlinc-jvm
em vez de /usr/bin/env para que o recurso shebang funcione corretamente.
Se você pretende usar scripts em produção, o kscript[14] pode ser útil. É uma biblioteca
que oferece vários recursos para trabalhar com scripts Kotlin, incluindo cache de
script compilado.
O código Kotlin não só pode ser compilado para bytecode Java, mas também para
vários outros formatos, como veremos a seguir.
Machine Translated by Google
Para destinos nativos: quando compilar para uma máquina virtual não é uma
opção, Kotlin/Native pode ser usado para compilar seu código-fonte para
diferentes destinos nativos, como iOS, Linux, MacOS, Windows e outros, e pode
ser executado sem um máquina virtual. Consulte o Apêndice 2, Kotlin/
Native, para obter uma introdução ao uso do Kotlin/Native.
Para misturar código Kotlin com Java ou outras linguagens na JVM, compile o
código usando kotlinc-jvm. Em seguida, simplesmente jogue o arquivo jar no classpath
ou modulepath junto com uma referência ao arquivo kotlin-stdlib.jar e use-o como usaria
qualquer jar criado a partir do código-fonte Java usando javac.
Empacotando
Kotlin é uma linguagem de escolhas, e esse espírito brilha desde o início com suporte para
múltiplos paradigmas de programação e uma série de opções para executar código Kotlin. Kotlin
não determina como você deve escrever aplicativos. Você pode começar aos poucos, com
apenas algumas linhas para construir scripts, e pode pedir à linguagem que o leve até a
construção de aplicativos altamente complexos com classes e dependências. Você pode usar
Kotlin para criar aplicativos do lado do servidor, opcionalmente com Spring. Você pode criar
aplicativos Android, transpilar Kotlin para JavaScript e também usar Kotlin/Native para
compilar para plataformas nativas direcionadas, como iOS e WebAssembly. A natureza versátil
do Kotlin o torna uma das poucas linguagens de programação full-stack.
Você pode compilar em bytecode Java e executar na JVM. Alternativamente, você pode executá-
lo como um script, ignorando a etapa extra de compilação. Se você gosta de desenvolvimento
front-end, poderá obter segurança em tempo de compilação junto com todos os benefícios do
Kotlin para transpilar o código para JavaScript. E para explorar pequenos trechos de código, você
pode usar o Kotlin REPL.
Neste capítulo, você obteve alguns insights de alto nível sobre os recursos do Kotlin e começou
a usá-lo. A seguir, você aprenderá os fundamentos da linguagem que usará todos os dias ao
programar com Kotlin.
Notas de rodapé
[2] https://twitter.com/abreslav
[3] https://www.jetbrains.com/
[4] https://developer.android.com/kotlin
[5] https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-funcional-way
[6] https://spring.io/blog/2017/01/04/introduzindo-kotlin-support-in-spring-framework-5-0
[7] https://www.jetbrains.com/idea/download
Machine Translated by Google
[8] https://kotlinlang.org/docs/tutorials/command-line.html
[9] http://openjdk.java.net/
[10] https://kotlinlang.org/
[11] https://kotlinlang.org/docs/tutorials/getting-started.html
[12] https://kotlinlang.org/docs/tutorials/getting-started-eclipse.html
[13] http://plugins.netbeans.org/plugin/68590/kotlin
[14] https://github.com/holgerbrandl/kscript
[15] https://webassembly.org/
Parte 1
Scripts com Kotlin
Kotlin é uma linguagem escalável – você pode criar scripts com
poucas linhas ou um aplicativo corporativo inteiro com
muitas classes e bibliotecas. Nosso objetivo é agregar valor,
não escrever muito código. Desse ponto de vista, a
concisão e a eficácia de cada linha de código são importantes.
Capítulo 2
Coisas simples devem ser fáceis de criar e coisas complicadas devem ser acessíveis. Rápido,
quantas linhas de código você precisa para encontrar programaticamente
o número de núcleos em uma máquina? Que tal o seguinte:
println(Runtime.getRuntime().availableProcessors())
Esse é o programa inteiro em Kotlin – com apenas meia linha de código, sem necessidade de
ponto e vírgula, sem importações e usando o Java JDK, mas com muito menos código e
cerimônia. Esse é Kotlin.
Neste capítulo, você aprenderá alguns princípios básicos — os blocos de construção que
normalmente fazem parte do corpo de funções e métodos, mas que também podem ser inseridos
diretamente em scripts em Kotlin. Isso inclui definir variáveis de números e strings, criar
constantes, especificar as informações de tipo, criar uma expressão de string com valores
incorporados, criar strings multilinhas – uma miscelânea de recursos que usaremos
frequentemente ao programar.
Machine Translated by Google
Kotlin torna opcionais uma série de coisas que são exigidas em outras
linguagens – ponto e vírgula, especificações explícitas de tipo e classes, para mencionar
algumas. Kotlin exige que você tome uma decisão consciente no momento de criar
uma variável se ela deve ser mutável ou imutável. Ele fornece modelos de string para
facilitar a criação de expressões de string e strings multilinhas. E favorece
expressões em vez de declarações, para reduzir a necessidade de variáveis mutantes.
Menos digitação
Você digitará menos – aquele ato de martelar as teclas do teclado – para criar
aplicativos com Kotlin. Isso ocorre porque muitas coisas que consideramos obrigatórias são
opcionais no Kotlin.
Quando você começa a programar em Kotlin, seu dedo mínimo direito obtém alívio
imediato das lesões por esforço repetitivo que pode ter sofrido durante a maior parte de sua
carreira de programação. Embora você possa, não é necessário terminar cada instrução
ou expressão com ponto e vírgula. Use o ponto-e-vírgula com moderação – apenas nas
ocasiões em que desejar colocar duas ou mais expressões ou instruções em uma
única linha.
O exemplo a seguir é uma sintaxe válida em Kotlin e pode ser escrito de forma
independente:
6*2
À primeira vista, pode não parecer grande coisa, mas, como você verá mais adiante neste
livro, não ter que colocar ponto-e-vírgula torna o código fluente, especialmente ao criar
DSLs internas.
Se você estiver migrando de linguagens como Java e JavaScript para Kotlin, é provável
que pressionar a tecla de ponto-e-vírgula seja uma ação involuntária agora.
Isso é compreensível, mas crie o hábito de omitir ponto-e-vírgula ao escrever em Kotlin.
Kotlin é digitado estaticamente, mas isso não significa que você precise especificar
os detalhes dos tipos de variáveis. A tipagem estática significa que o tipo de variáveis é
verificado e a sanidade do tipo é garantida em tempo de compilação.
Machine Translated by Google
Kotlin tem inteligência - inferência de tipo - para determinar o tipo de variáveis com base no
contexto. Vamos definir uma variável sem especificar o tipo e depois perguntar o tipo dessa variável.
essência/typeinference.kts
println(saudação)
println(saudação::
classe) println(saudação.javaClass)
A chamada ::class está solicitando a classe Kotlin do objeto referenciado pela variável. A
É raro que as classes Kotlin e Java sejam diferentes – apenas as classes que são intimamente
conhecidas pelo compilador Kotlin exibirão tais diferenças.
No exemplo anterior, o recurso de inferência de tipo do Kotlin determina que o tipo de saudação é
String com base no valor atribuído a ele. A saída mostra estes detalhes:
olá
classe kotlin.String
classe java.lang.String
Alguns desenvolvedores temem a inferência de tipo; eles se perguntam se isso é uma questão de
tempo de execução e se de alguma forma diminui a eficácia da verificação de tipo em tempo de
compilação. A resposta curta é não.
Para ser justo, o código acima revelou o tipo do objeto referenciado em tempo de execução,
mas qual é o tipo da variável greet em tempo de compilação? Podemos descobrir isso cometendo
essência/typechecking.kts
println(saudação)
Machine Translated by Google
cumprimentar = 0
Kotlin não leva a inferência de tipo ao extremo – ele permite omitir os detalhes do tipo
apenas em locais onde o tipo é óbvio. Ao definir funções e métodos, você deve
especificar o tipo dos parâmetros, embora possa omitir o tipo de retorno. Em
geral, especifique o tipo de retorno para APIs que não são internas às suas bibliotecas,
mas que são visíveis para o usuário externo. Discutiremos isso mais detalhadamente
quando explorarmos a criação de funções.
De sua parte, incentive seus colegas a dar nomes significativos às variáveis, para
que seja mais fácil identificar o tipo e a intenção das variáveis.
Por exemplo, val taxRate = 0,08 é melhor que val t = 0,08.
Variáveis locais são internas e não são vistas pelos usuários do seu código. Portanto, o
uso da inferência de tipos não retira nenhum detalhe dos usuários de suas funções.
Deixe de fora os detalhes do tipo sempre que possível e, em vez disso, use a
inferência de tipo com nomes descritivos, mas não necessariamente longos, para variáveis.
Vamos criar um script com uma função que não pertence a nenhuma classe e
algum código independente que não faz parte de nenhuma função.
essência/standalone.kts
divertido, nofluff() {
println( "nofluff chamado...")
tente
{ nofluff() }
catch(ex: Exceção) {
val stackTrace = ex.getStackTrace()
println(stackTrace[0])
println(stackTrace[1])
}
Machine Translated by Google
O corpo autônomo do código abaixo da função chama a função nofluff(), que não pertence
a nenhuma classe. A função explode com uma exceção e o código de chamada imprime os
dois primeiros quadros da pilha da exceção. A saída deste código mostra que,
primeiro, Kotlin não nos força a escrever classes e métodos e, segundo, ele agrupa o
código em uma classe automaticamente.
try-catch é opcional
O compilador Java nos força a capturar ou propagar explicitamente exceções verificadas.
O debate sobre se as exceções verificadas são boas ou ruins pode nunca ser resolvido –
alguns desenvolvedores adoram, enquanto outros odeiam. Não precisamos ser arrastados
para essa briga; em vez disso, vamos nos concentrar no que o Kotlin oferece.
Kotlin não força você a capturar nenhuma exceção – marcada ou desmarcada. Se você não
colocar um try-catch em torno de uma chamada de função e se essa função falhar, a
exceção será automaticamente propagada para o chamador da sua função
Machine Translated by Google
ou código. Se uma exceção não for tratada, isso resultará no encerramento fatídico do
seu programa.
Em Java, por exemplo, o método sleep() da classe Thread lança uma exceção verificada e
o compilador nos força a lidar com ela. Como resultado, qualquer chamada para sleep()
deve ser cercada por um try e seguida por uma noite sem dormir, perguntando-se o
que fazer com aquela InterruptedException fedorenta que pode potencialmente
ser lançada a partir dessa chamada. Não há necessidade de perder o sono por causa
desses problemas em Kotlin:
essência/nocatch.kts
O código não possui nenhum try e catch, mas quando executado ele imprimirá as duas
linhas de saída com um atraso de um segundo após a impressão da primeira linha.
É uma boa prática programar defensivamente para lidar com exceções. Ao mesmo
tempo, como o Kotlin não nos força um try-catch , não ficamos tentados a colocar aqueles
blocos catch vazios que muitos programadores Java parecem escrever simplesmente para
silenciar o compilador Java. Lembre-se de que o que você não trata é propagado
automaticamente para o chamador.
Você viu como o compilador Kotlin oferece muita flexibilidade ao colocar menos
demandas. Ao mesmo tempo, o compilador procura possíveis erros no código, para
torná-lo mais seguro, como veremos a seguir.
Machine Translated by Google
Avisos sensatos
Mesmo que um trecho de código seja sintaticamente válido, alguns problemas potenciais
podem estar ocultos. Obter um aviso antecipado, durante o tempo de compilação, pode nos
ajudar a corrigir proativamente esses possíveis problemas. O compilador Kotlin procura
alguns problemas potenciais no código.
Por exemplo, se um parâmetro recebido em uma função ou método não for usado, o
compilador emitirá um aviso. No script a seguir, o parâmetro passado para
computate() não é usado.
essência/não utilizado.kts
println(computação(4))
Ao executar este script, além de exibir o resultado, o Kotlin também reportará quaisquer
avisos para parâmetros não utilizados:
0
unused.kts:1:13: aviso: o parâmetro 'n' nunca é usado fun compute(n:
Int) = 0
^
É uma boa prática de desenvolvimento de software tratar avisos como erros — uma
prática ágil enfatizada em Práticas de um desenvolvedor ágil [SH06]. Kotlin facilita isso
com a opção -Werror . Para usar esta opção, coloque-a na linha de comando ao
compilar o código ou execute-o como um script, assim:
O compilador Kotlin é sensato ao dar avisos. Por exemplo, não é incomum que os
programas ignorem os argumentos da linha de comando. Forçar-nos a usar parâmetros
dados a main() é considerado draconiano, então Kotlin não reclama de parâmetros
não utilizados para main(), como veremos no próximo exemplo.
Mas se você tiver um parâmetro não utilizado em main() dentro de um script (um
arquivo .kts em vez de um arquivo .kt ), o Kotlin lhe dará um aviso – ele decide com
base no contexto.
essência/UnusedInMain.kt
Ao compilar o código usando kotlinc-jvm e executá-lo usando java ou kotlin, você obterá
a seguinte saída. O aviso é do kotlinc e a saída é da execução do arquivo jar gerado:
A partir do Kotlin 1.3, você pode omitir os parâmetros de main() se não precisar deles.
Vimos como Kotlin tenta fazer um ataque preventivo contra possíveis erros. Nesse
sentido, a linguagem quer que você seja decisivo quanto à imutabilidade. Vamos
explorar essa escolha a seguir.
Machine Translated by Google
Ao contrário do Java, onde você coloca o tipo antes do nome da variável, no Kotlin você
coloca o nome da variável primeiro, depois dois pontos, seguido pelo tipo. Kotlin considera
a sequência que Java exige como “colocar a carroça na frente dos bois” e dá mais ênfase
aos nomes de variáveis do que aos tipos de variáveis.
valor pi = 3,14
De qualquer forma, o valor de pi não pode ser modificado; val é como final em Java.
Qualquer tentativa de alterar ou reatribuir um valor a variáveis definidas usando val
resultará em um erro de compilação. Por exemplo, o código a seguir não é válido:
valor pi = 3,14
E se quisermos alterar o valor de uma variável? Para isso, Kotlin tem var – também
conhecido como “palavra-chave da vergonha”. Variáveis definidas usando var podem
sofrer mutação à vontade.
Aqui está um script que cria uma variável mutável e depois modifica seu valor:
pontuação variável = 10
println(pontuação) //10
Machine Translated by Google
pontuação = 11
println(pontuação) //11
Variáveis mutantes são um modo de vida no estilo imperativo de programação. Mas isso
é um tabu na programação funcional. Em geral, é melhor preferir a imutabilidade –
ou seja, val em vez de var. Aqui está um exemplo para ilustrar por que isso acontece
melhorar:
essência/mutate.kts
fator variável = 2
fator = 0
println(doubleIt(2))
Não execute o código; em vez disso, observe-o, mostre-o a alguns de seus colegas e
pergunte qual será o resultado do código. Faça uma enquete. O resultado será igual ao
que a maioria das pessoas disse que seria – brincadeira. A correção do programa não é
um processo democrático; felizmente, eu acho.
A saída é 4.
A saída é 0, eu acho.
O QUE – a resposta que o código evocou em alguém recentemente.
A saída do código acima é 0 – talvez você tenha adivinhado certo, mas adivinhar
não é uma atividade agradável durante a codificação.
Enquanto val em Kotlin é muito parecido com o final do Java, Kotlin – ao contrário do
Java – insiste em marcar variáveis mutáveis com var. Isso torna mais fácil procurar a
presença de var em Kotlin do que procurar a ausência de final em Java. Portanto, no
Kotlin, é mais fácil examinar o código em busca de possíveis erros que possam surgir da
mutabilidade.
Porém, uma palavra de cautela com val : ele apenas torna a variável ou
referência uma constante, não o objeto referenciado. Então val apenas garante a
imutabilidade da referência e não impede a mudança do objeto.
Por exemplo, String é imutável, mas StringBuilder não. Quer você use val ou var, uma
instância de String está protegida contra alterações, mas uma instância de
StringBuilder não. No código a seguir, a variável message é imutável, mas o objeto ao
qual ela se refere é modificado usando essa variável.
mensagem.append( "lá")
Assim como Java, Kotlin também possui dois tipos de verificações de igualdade:
Mas o operador de igualdade estrutural == em Kotlin é mais do que o método equals() em Java.
referência str1 for nula. Não é assim quando você usa == em Kotlin.
O operador de igualdade estrutural do Kotlin lida com referências nulas com segurança . Vamos
essência/equalidade.kts
Se essas comparações fossem feitas com equals() em Java, o resultado líquido teria sido um
NullPointerException em tempo de execução, mas Kotlin lida com os nulos com segurança.
Se os valores mantidos nas duas referências forem iguais, o resultado será verdadeiro e , caso
contrário, falso . Se uma ou outra referência for nula, mas não ambas, o resultado será falso. Se
é verdade. Podemos ver isso na saída, mas você também verá um bônus adicional:
verdadeiro
falso
falso
falso
verdadeiro
Modelos de string
Em programas, frequentemente criamos strings com valores de expressões incorporados.
Concatenar valores para criar strings usando o operador + torna o código detalhado e difícil
de manter. Os modelos de string resolvem esse problema fornecendo uma solução
elegante.
Dentro de uma string entre aspas duplas, o símbolo $ pode prefixar qualquer variável para
transformá-la em uma expressão. Se a expressão for mais complexa que uma variável
simples, envolva a expressão com ${}.
Um símbolo $ que não é seguido por um nome de variável ou expressão é tratado como literal.
Você também pode escapar do símbolo $ com uma barra invertida para usá-lo como literal.
Aqui está um exemplo com um modelo de string. Além disso, ele contém uma string
simples com símbolos $ incorporados que são usados como literais.
essência/stringtemplate.kts
val output = "O valor $price após impostos chega a $${price * (1 + taxRate)}" val disclaimer
= "O valor
está em US$, isso mesmo em \$only"
println(saída)
println(isenção de responsabilidade)
Os outros símbolos $ no código são usados como literais. Vamos dar uma olhada na
saída do código:
O cuidado anterior de preferir val a var também se aplica aqui. Vamos pegar o código
com var que vimos anteriormente e modificá-lo ligeiramente para usar um modelo de string.
essência/mutateconfusion.kts
fator variável = 2
fator = 0
println(doubleIt(2))
println(mensagem)
Mais uma vez, não execute o código, mas observe-o e descubra a saída desse código.
Isso corresponde à seguinte saída?
0
O fator é 2
O fator variável dentro da função doubleIt() liga-se à variável fora de seu escopo imediato –
A seguir, vamos ver como usar strings brutas para remover alguma confusão e criar
múltiplas linhas de strings.
Machine Translated by Google
Cordas brutas
Lidar com caracteres de escape torna o código confuso. Em vez de usar strings
com escape, no Kotlin podemos usar strings brutas que começam e terminam com
três aspas duplas. Podemos usar strings brutas para colocar qualquer caractere, sem a
necessidade de usar escapes, e também podemos usá-los para criar strings multilinhas.
nenhuma escapatória
Em uma string de escape que começa e termina com aspas duplas simples, não
podemos colocar uma variedade de caracteres, como nova linha ou aspas
duplas, por exemplo, sem usar o caractere de escape \. Mesmo um caso simples
pode ser desagradável de ler, como este:
Tivemos que escapar das aspas duplas necessárias na string. Quanto mais usamos
strings de escape, mais confuso fica. Em vez de usar strings com escape, no
Kotlin usamos strings brutas. Assim como as strings de escape, as strings brutas
também podem ser usadas como modelos de strings, mas sem a confusão de caracteres
de escape. Aqui está a string de escape acima alterada para string bruta - menos
confusa, mais legível:
Use string com escape, ironicamente, quando você não precisa escapar de nada - para
strings pequenas, simples e simples. Se você precisar de algo mais complexo ou
com várias linhas de string, vá para strings brutas.
Strings multilinhas
O infame operador + é frequentemente usado para criar várias linhas de strings e isso
leva a um código desagradável e difícil de manter. Kotlin remove essa
cerimônia com uma string multilinha, que é uma string bruta que contém quebras
de linha. Strings multilinhas também podem atuar como modelos de strings.
Machine Translated by Google
Vamos criar uma string que percorre várias linhas, mas sem o operador + .
essência/memo.kts
println(memorando)
A string multilinha começa com três aspas duplas, contém a expressão do modelo
de string para avaliar o nome da variável e termina com três aspas duplas. A saída
deste código são várias linhas de string com a expressão incorporada avaliada.
essência/nestedmemo.kts
memorando de devolução
""
retornar
}
println(createMemoFor( "Eva"))
Machine Translated by Google
retornar memo.trimMargin()
}
retornar
""
println(createMemoFor( "Eva"))
Se você não quiser usar | como delimitador inicial, porque talvez o seu texto
contenha esse caractere em locais arbitrários, incluindo o primeiro caractere de um
Machine Translated by Google
nova linha, então você pode escolher algum outro caractere - por exemplo, vamos
prosseguir e escolher ~:
Até agora neste capítulo, vimos as melhorias nas expressões e instruções em Kotlin em
comparação com linguagens como Java. Mas Kotlin prefere expressões a declarações.
Vamos discutir isso a seguir.
Machine Translated by Google
Embora as declarações sejam predominantes, elas têm um lado negro: não retornam
nada e têm efeitos colaterais. Um efeito colateral é uma mudança de estado: alterar uma
variável, gravar em um arquivo, atualizar um banco de dados, enviar dados para um
serviço web remoto, corromper o disco rígido... As expressões são muito mais legais - elas
retornam um resultado e não têm modificar qualquer estado para ser útil.
Vejamos um exemplo para ver a diferença. Vamos escrever um trecho de código Kotlin
como faríamos em linguagens como Java e C#:
O método canVote() usa if como uma instrução. Como as instruções não retornam nada,
a única maneira de obtermos algum resultado útil para processamento posterior é
configurar uma variável mutável e modificar seu valor dentro das ramificações.
Machine Translated by Google
val status = if (age > 17) "sim, por favor vote" else "não, por favor volte"
Pudemos usar val em vez de var , pois não estamos alterando uma variável.
E pudemos usar inferência de tipo para status, já que o valor é conhecido pela expressão
if . O código é menos barulhento e também menos sujeito a erros.
Kotlin também trata try-catch como uma expressão. A última expressão da parte try se
torna o resultado se não houver exceção; caso contrário, a última instrução dentro do
catch se tornará o resultado.
2
} catch(ex: Exceção) {
4
} finalmente
{ //...
}
}
a = b = c //ERRO
Uma razão para esse comportamento, de não tratar = como uma expressão, é
que o Kotlin permite interceptar get e sets em variáveis com delegados,
como veremos mais adiante neste livro. Se = fosse tratado como uma expressão,
então o encadeamento de atribuições poderia levar a um comportamento inesperado e
complexo que poderia ser confuso e se transformar em uma fonte de erros.
Machine Translated by Google
Empacotando
Kotlin elimina muita cerimônia das tarefas de programação mais fundamentais.
Para a mesma tarefa, muitas vezes você descobrirá que digita muito menos em
Kotlin do que em vários idiomas convencionais. O ponto-e-vírgula é opcional,
as declarações de variáveis aproveitam a inferência de tipos, você não é forçado
a colocar tudo em uma classe ou mesmo em uma função, o tratamento de
exceções não é imposto a você - essas coisas aliviam o fardo da programação. Ao
mesmo tempo, Kotlin tem avisos sensatos para evitar erros comuns. Também
melhora a segurança, solicitando que você escolha entre imutabilidade e
mutabilidade desde o início. Além disso, a verificação de igualdade é
segura para nulos . Modelos de strings e strings multilinhas reduzem o
esforço para criar strings com expressões. E Kotlin fornece mais expressões do
que instruções quando comparado a linguagens como Java, C# e JavaScript.
Capítulo 3
Kotlin adota uma abordagem altamente pragmática para criar código de boa qualidade
– crie pequenas funções independentes e simples onde elas forem suficientes e
transforme seu código em métodos de classes somente quando necessário. Neste
capítulo, focaremos em funções autônomas por dois motivos. Primeiro, porque podemos,
ou seja, em Kotlin podemos criar funções autônomas de nível superior para reutilizar
código e não precisamos desperdiçar nosso tempo e esforço com classes se houver pouco valor.
Com Kotlin você não precisa mascarar funções autônomas como métodos estáticos
de uma classe - ou seja, você não precisa fingir que está fazendo OO para agradar a
linguagem. Você pode criar funções globais de nível superior, como em linguagens como
C e C++, se isso for adequado para sua aplicação. As funções podem residir no nível
superior ou diretamente nos pacotes – você decide onde colocá-las.
Machine Translated by Google
O Kotlin exige que você especifique os tipos de parâmetros para funções, mas você pode
solicitar que ele infira o tipo de retorno para funções de expressão única. Ao chamar
funções, não é necessário passar um argumento para cada parâmetro; em vez
disso, você pode optar por usar argumentos padrão. Você pode usar esse recurso para
evoluir facilmente funções e métodos. Para tornar a chamada aos métodos expressiva,
o Kotlin lhe dá o poder de nomear seus argumentos.
Isso aumenta muito a legibilidade do código. Além disso, você pode passar um número
variável de argumentos para funções sem perder a segurança em tempo de compilação.
Kotlin também tem capacidade de desestruturação, o que fornece uma maneira
altamente concisa de extrair propriedades de objetos em variáveis independentes.
Neste capítulo você aprenderá como trabalhar com funções globais ou autônomas.
Começaremos com as regras do Kotlin para definir funções, veremos como ele trata
funções como expressões e, em seguida, examinaremos muitos recursos úteis, incluindo
argumentos padrão, argumentos nomeados, definição de número variável de
argumentos, o operador spread e uso de desestruturação. Usando esses recursos,
você pode criar código altamente expressivo, fácil de ler e mais flexível de manter. Se
você estiver mais interessado em escrever código orientado a objetos, tenha
certeza de que os conceitos aprendidos aqui também se aplicam a métodos de classes.
Criando Funções
Criar funções e métodos em Kotlin é totalmente diferente de criar métodos em Java. A maior
flexibilidade que o Kotlin oferece elimina cerimônias desnecessárias na criação de funções.
Vamos começar com funções curtas, explorar a inferência de tipos e, em seguida, examinar
a definição de parâmetros e funções multilinhas.
Funções do KISS
Kotlin segue o mantra “Keep it simple, estúpido” – o princípio KISS – para definir definições. Funções
pequenas devem ser simples de escrever, sem ruído, sem complicações. Aqui está uma das
funções mais curtas que você pode escrever em Kotlin, seguida de uma chamada para ela.
funções/kiss.kts
println(saudação())
As declarações de função começam com a palavra-chave fun – Kotlin quer que você se
lembre de se divertir sempre que olhar para uma função ou método. O nome da função é seguido
por uma lista de parâmetros, que pode estar vazia. Se a função for uma função de expressão
única, que é muito curta, separe o corpo da declaração usando o operador = em vez de usar a
sintaxe do bloco {} . Para funções curtas, o tipo de retorno pode ser inferido. Além disso, a
palavra-chave return não é permitida para funções de expressão única, que são funções sem
corpo de bloco.
Olá
Com base no contexto, Kotlin determina que greet() está retornando uma String.
Estamos atribuindo isso a uma mensagem variável do tipo Int, o que é proibido, e o
código não será compilado.
Kotlin inferirá o tipo de retorno das funções somente quando o corpo da função for uma
expressão única e não um bloco.
E se a função não retornar nada? Vamos visitar essas incômodas funções vazias a
seguir.
Kotlin usa um tipo especial chamado Unit que corresponde ao tipo void de Java. O
nome Unit vem da teoria dos tipos e representa um singleton que não contém nenhuma
informação. Você pode usar Unit de forma consistente para especificar que não está
retornando nada útil. Além disso, Kotlin inferirá o tipo como Unit se a função não retornar
nada. Vamos dar uma olhada nesta inferência primeiro.
funções/inferunit.kts
A função sayHello() imprime uma mensagem na saída padrão usando println(), que
sabemos ser uma função void em Java, mas retorna Unit em Kotlin. Usamos
inferência de tipo para o tipo de retorno de sayHello(), mas tenha certeza de que ela é
inferida como Unit. Verificamos o tipo inferido atribuindo o resultado de sayHello() a uma
variável do tipo String, e isso falhará na compilação devido à incompatibilidade de tipo.
Em vez de usar inferência de tipo, podemos especificar explicitamente Unit como o tipo
de retorno também. Vamos alterar sayHello() para especificar o tipo de retorno e
então atribuir o resultado a uma variável do tipo Unit:
funções/especificarunit.kts
Machine Translated by Google
Como até mesmo funções void retornam Unit em Kotlin, todas as funções podem ser
tratadas como expressões e podemos invocar métodos nos resultados de qualquer função.
Por sua vez, o tipo Unit possui os métodos toString(), equals() e hashCode() .
Embora não seja muito útil, você pode invocar qualquer um desses métodos. Por
exemplo, no código anterior passamos a variável message , que é do tipo Unit, para println(),
e que chama internamente o método toString() de Unit. Vamos dar uma olhada na saída:
Bem, olá O
resultado de sayHello é kotlin.Unit
O método toString() de Unit apenas retorna uma String com valor kotlin.Unit, o nome
completo da classe.
Como todas as funções retornam algo útil, ou pelo menos uma unidade , todas elas servem
como expressões e o resultado pode ser atribuído a uma variável ou usado para
processamento posterior.
As funções que usamos até agora neste capítulo não aceitam nenhum parâmetro, mas na
realidade as funções normalmente aceitam parâmetros. Vamos agora nos concentrar
na definição de parâmetros e na passagem de argumentos para funções.
Definindo Parâmetros
Algumas linguagens como Haskell e F# podem mergulhar em funções e inferir os tipos de
parâmetros. Pessoalmente, não sou fã disso; alterar a implementação de uma função
pode resultar na alteração dos tipos dos parâmetros. Isso é perturbador para mim.
Kotlin insiste em especificar os tipos de parâmetros para funções e métodos. Forneça o tipo
do parâmetro logo após o nome do parâmetro, separado por :.
Machine Translated by Google
funções/passingarguments.kts
Embora o tipo do nome do parâmetro seja obrigatório, podemos omitir o tipo de retorno
se quisermos que o Kotlin infira o tipo de retorno. Se você tiver mais de um parâmetro,
liste-os separados por vírgulas entre parênteses.
Você viu em Prefer val over var, que devemos preferir a imutabilidade à mutabilidade
e que o Kotlin força você a escolher entre val e var ao definir variáveis locais. Mas ao
definir a função greet() , não especificamos val ou var para o parâmetro. Isso tem um
bom motivo.
Vimos funções realmente curtas até agora. Vejamos como escrever funções mais complexas.
Quando uma função é pequena, uma única expressão, podemos separar o corpo da função da
declaração usando o operador = . Se a função for mais complexa que isso, coloque o corpo em um
bloco {} e não use =. Você deve especificar o tipo de retorno para qualquer função com corpo
Vamos escrever uma função que retorne o máximo entre os números em um determinado
variedade.
funções/multilinefunction.kts
retornar grande
}
A função max() usa um array como parâmetro, especifica Int como o tipo de retorno e tem um
corpo envolvido em um bloco {}. Neste caso, o tipo de retorno não é opcional – você deve especificá-
Uma palavra de cautela: não use = seguido por um corpo {} de bloco . Se você especificar
gerará um erro.
E se omitirmos o tipo de retorno, mas usarmos = e depois um corpo de bloco em vez de uma única
divertido notReally() = { 2 }
Machine Translated by Google
Kotlin não inferirá o tipo de retorno entrando no bloco de código. Porém, ele assumirá que
todo o bloco seja uma expressão lambda ou uma função anônima — um tópico que
abordaremos mais adiante neste livro. Kotlin acha que notReally() é uma função que retorna
uma expressão lambda – opa.
Por uma questão de diversão, uma definição reconhecidamente distorcida de diversão, vamos
explorar o efeito de usar = com um bloco, mas sem um tipo de retorno.
funções/caveat.kts
divertido f1()
= 2 divertido f2()
= { 2 } divertido f3(fator: Int) = { n: Int -> n * fator }
println(f1()) //2
println(f2()) //() -> kotlin.Int println(f2()
()) //2 println(f3(2)) //
(kotlin.Int) - > kotlin.Int println(f3(2)(3)) //6
A função f1() é inferida para retornar um Int. Mas Kotlin inferiu que a função f2() está
retornando uma expressão lambda que não aceita parâmetros e retorna um Int. Da mesma
forma, inferiu que a função f3() está retornando um lambda que pega Int e retorna Int.
É altamente improvável que alguém que escreve esse código tenha muitos amigos – não
adianta escrever um código como esse e passar o resto da vida sozinho. Se você deseja
criar funções que retornem lambdas, veremos maneiras melhores de fazer isso mais tarde.
Resumindo, não misture = com o corpo do bloco.
Você sabe criar funções; a seguir, veremos como podemos evoluir facilmente as funções
existentes no Kotlin.
Machine Translated by Google
A função greet() tem uma string codificada "Hello", mas e se quisermos fornecer
flexibilidade ao chamador da função para fornecer uma gentileza de sua escolha?
funções/defaultarguments.kts
Machine Translated by Google
saudação divertida (nome: String, msg: String = "Olá"): String = "$msg $nome"
O código existente que chama greet() com apenas um argumento para name
continua funcionando. Qualquer nova chamada para greet() pode passar um argumento, para
nome, ou dois argumentos, para nome e mensagem. Na primeira chamada, como msg
não recebe um valor, o argumento padrão Hello é usado. Na segunda chamada, o
argumento fornecido Howdy é usado e o argumento padrão é ignorado.
Como um valor será necessário para o parâmetro regular, o chamador será forçado a
fornecer um valor para o parâmetro com argumento padrão também – isso anula o
propósito de ter o argumento padrão.
O argumento padrão não precisa ser literal; pode ser uma expressão.
Além disso, você pode calcular os argumentos padrão para um parâmetro usando os
parâmetros à sua esquerda.
Machine Translated by Google
funções/defaultcompute.kts
saudação divertida (nome: String, msg: String = "Oi ${nome.length}") = "$msg $nome"
Mais uma vez, quando dois argumentos são passados para greet(), o argumento padrão é ignorado;
não é computado. Por outro lado, quando apenas o valor do parâmetro name é passado, então o valor
do parâmetro msg é calculado a partir da expressão do argumento padrão. Na segunda chamada a
greet(), passamos apenas o nome e o resultado; msg é calculado com base no valor do parâmetro
Neste exemplo, trocar a posição de name e msg resultará em um erro de compilação, pois
name não foi inicializado na expressão de argumento padrão - outro motivo para colocar
funções/namedarguments.kts
Você pode estar se perguntando o que esses números significam, e isso certamente não é
divertido quando se lida com prazos iminentes. Você terá que mudar de contexto e consultar a
documentação da função ou sua declaração para encontrar o
funções/namedarguments.kts
Código mal escrito pode transformar o ser humano mais educado em um péssimo xingador
– a legibilidade é importante. Kotlin é uma linguagem de fluência, e esse princípio também brilha
nas chamadas de métodos.
Sem alterar nada na forma como uma função é definida, você pode tornar as chamadas aos métodos mais
funções/namedarguments.kts
Isso é muito melhor – sem suposições e sem preocupações sobre o que esses parâmetros
significam. Você pode atribuir um valor ao nome de um parâmetro ali mesmo na
chamada de função. Mesmo que a função tenha peso como último parâmetro, não é necessário
que seja o último na chamada; argumentos nomeados podem ser colocados em qualquer
ordem.
A confusão neste código está entre os diferentes valores inteiros; o valor do nome em
createPerson é intuitivo. Podemos colocar argumentos nomeados após argumentos
posicionais, conforme mostrado nos dois exemplos a seguir:
funções/namedarguments.kts
funções/namedarguments.kts
Embora a última seja uma sintaxe Kotlin válida, do ponto de vista da legibilidade, pode ser
melhor usar o argumento nomeado para a idade também.
Como age tem um argumento padrão, podemos deixá-lo de fora se usarmos valores
nomeados para todos os outros parâmetros ou argumentos posicionais para todos os
parâmetros à sua esquerda e argumentos nomeados para todos os outros parâmetros.
Por exemplo, as duas chamadas a seguir que omitem o argumento da idade são válidas:
funções/namedarguments.kts
vararg e propagação
Funções como println() aceitam um número variável de argumentos. O recurso
vararg do Kotlin fornece uma maneira segura de criar funções que podem receber
um número variável de argumentos. O operador spread é útil para explodir ou espalhar
valores em uma coleção como argumentos discretos. Veremos primeiro o vararg e o
spread a seguir.
funções/vararg.kts
retornar grande
}
Comparada com a função max() que escrevemos anteriormente, esta versão possui
duas alterações, ambas na lista de parâmetros. Primeiro, os números dos parâmetros
são prefixados com a palavra-chave vararg. Segundo, o tipo do parâmetro é especificado como Int
Machine Translated by Google
em vez de IntArray. O tipo real dos números dos parâmetros é uma matriz; o vararg
anota o parâmetro como uma matriz do tipo especificado.
Vamos fazer algumas chamadas para a função, passando alguns valores discretos.
funções/vararg.kts
A função max() utiliza apenas um parâmetro, mas você pode usar vararg quando uma
função também utiliza mais de um parâmetro. Mas apenas um parâmetro pode ser
anotado como vararg.
Aqui está uma função que recebe dois parâmetros, mas apenas o último é marcado
como vararg.
funções/mixvararg.kts
O tipo do parâmetro vararg pode ser independente do tipo de qualquer outro parâmetro
que a função aceita.
O parâmetro vararg não precisa ser o parâmetro final, mas eu recomendo fortemente que
seja. Considere a seguinte versão da função greetMany() :
Machine Translated by Google
greetMany( "Tom", "Jerry", "Spike", msg = "Olá") // Olá Tom, Jerry, Spike
Se você anotar um parâmetro não final com vararg, o chamador será forçado a usar
argumentos nomeados.
Coloque-o na posição final para que os chamadores não sejam forçados a usar
argumentos nomeados.
Coloque-o antes do último parâmetro se for esperado que o último argumento seja
uma expressão lambda — exploraremos isso mais adiante neste livro.
Operador de propagação
Dê uma outra olhada na função max() com vararg no exemplo anterior - ela tornou mais
fácil passar diferentes números de argumentos. Às vezes, porém, podemos querer
passar valores que estão em um array ou lista para uma função com vararg. Mesmo que
a função possa receber um número variável de argumentos, não podemos enviar
diretamente um array ou uma lista. É aqui que entra o operador spread. Para ver um
exemplo de uso desse operador, vamos começar com a seguinte instância:
funções/vararg.kts
Machine Translated by Google
O vararg implica que podemos passar qualquer número de argumentos para este único
parâmetro. Mas se passarmos um array como argumento, obteremos um erro:
println(max(values)) //ERRO //
incompatibilidade de tipo: o tipo inferido é IntArray, mas Int era esperado
Embora internamente o tipo de parâmetro vararg seja um array, Kotlin não quer que
passemos um argumento de array. Só aceitará vários argumentos do tipo vararg
especificado .
funções/vararg.kts
Mas isso é prolixo e você nunca será capaz de mostrar esse código com orgulho para
ninguém, nem mesmo para a mãe.
Onde o parâmetro é anotado como vararg, você pode passar um array – do tipo correto, é
claro – prefixando-o com o operador spread *. Vamos passar os valores do array como
argumento para o parâmetro numbers de max():
funções/vararg.kts
println(max(*valores)) //21
Isso é muito melhor. Ao colocar um * na frente do argumento, você está pedindo ao Kotlin
para espalhar os valores nessa matriz como valores discretos para o parâmetro vararg .
Não há necessidade de escrever código detalhado; a combinação de vararg e spread
restaura a harmonia.
Se tivermos um array, podemos usar spread, mas muitas vezes trabalhamos com listas em
vez de arrays. Se quisermos passar uma lista de valores, não podemos usar o operador
spread na lista diretamente. Em vez disso, temos que converter a lista em um array,
Machine Translated by Google
do tipo desejado e depois use spread. Aqui está um exemplo de como isso ficaria:
funções/vararg.kts
Desestruturação
representa uma tupla. Veremos isso mais detalhadamente em Usando Par e Triplo. Por
enquanto, usaremos Triple para retornar um grupo de três valores:
funções/desestruturação.kts
Aqui está uma chamada tradicional e chata para a função acima, para receber o resultado e
atribuir três variáveis diferentes.
funções/desestruturação.kts
Isso exigiu várias linhas de código e algumas operações de ponto. Mas quando o tipo de
retorno de uma função é Par, Triplo ou qualquer classe de dados, podemos usar a
funções/desestruturação.kts
Quatro linhas reduzidas a uma única linha de código concisa. Parece que a função
getFullName() retornou repentinamente vários valores – uma bela ilusão.
As três variáveis imutáveis primeiro, meio e último são definidas nessa linha e recebem
respectivamente. Na realidade, isso funciona porque a classe Triple possui métodos especializados
para auxiliar na desestruturação; você aprenderá sobre isso mais adiante no livro. A ordem em que as
Suponha que não nos importamos com uma das propriedades do objeto que está sendo
retornada. Por exemplo, se não quisermos o nome do meio, podemos usar um sublinhado
(_) para ignorá-lo.
funções/desestruturação.kts
Da mesma forma, você pode pular mais de uma propriedade usando vários _s, como
então:
funções/desestruturação.kts
println(último) //Adams
Você pode colocar _ em qualquer posição que deseja ignorar. Se você quiser parar em uma
determinada posição e ignorar o resto, você não precisa preencher todos
Machine Translated by Google
espaços restantes com _s. Por exemplo, para obter apenas o nome do meio podemos escrever:
funções/desestruturação.kts
println(meio) //Quincy
Além de usar a desestruturação quando o tipo de retorno é uma classe de dados, você também
pode usar a desestruturação para extrair chave e valor das entradas do Mapa — consulte
Usando o Mapa.
Se você está curioso para saber como a desestruturação funciona nos bastidores e quais são
esses métodos especiais aos quais mencionei, fique ligado; revisitaremos a destruição e exploraremos
mais detalhadamente em Classes de dados.
Machine Translated by Google
Empacotando
Kotlin não força você a criar métodos; você também pode criar funções de nível
superior. Isso abre mais algumas opções de design em Kotlin do que em Java – os
aplicativos não precisam ser compostos apenas por objetos, eles também podem ser
compostos por funções. Isso permite criar código processual, orientado a objetos ou
de estilo funcional, o que for melhor em um determinado contexto. O compilador pode
inferir tipos de retorno para funções sem bloco de expressão única. Os tipos de
parâmetros são sempre obrigatórios e isso é bom.
Capítulo 4
Conte quantas vezes você usou loops for em seu código. Chocante.
Algo que é tão amplamente utilizado e fundamental como a iteração deve ser fluente,
conciso, fácil de escrever e fácil de entender. No entanto, em linguagens semelhantes
a C, os loops for têm sido bastante primitivos e detalhados. Não é assim em Kotlin.
Neste capítulo, você aprenderá os recursos do Kotlin para iterar de maneira concisa e
elegante em intervalos de valores e em objetos em coleções. Você verá que o código
que você escreve para filtrar dados e tomar decisões não precisa ser uma série de blocos
if-else repetidos . A elegante correspondência de argumentos de Kotlin
Machine Translated by Google
Depois de adquirir os recursos fornecidos em Kotlin, você nunca mais vai querer voltar
às antigas formas de iteração. A sintaxe concisa, agradável e expressiva irá mantê-lo em
movimento, motivado e focado no problema em questão. Como resultado, você escreverá
menos código para implementar suas regras de negócios.
Como frequentemente trabalhamos com intervalos de valores, você pode usar prontamente
as classes e funções do pacote kotlin.ranges para iterar bem, transformando a tarefa
de escrever esse código em uma experiência agradável. O loop for aprimorado não serve
apenas para um intervalo de valores; você também pode usá-lo para iterar
valores em uma coleção.