Kotlin em ação
Descrição do livro
Os desenvolvedores querem que seu trabalho seja feito – e quanto menos complicações houver, melhor. Programar com Kotlin significa ter menos complicações. A linguagem de programação Kotlin oferece uma sintaxe expressiva, um sistema de tipos robusto e intuitivo e o suporte de um ótimo conjunto de ferramentas, juntamente com uma interoperabilidade natural com códigos, bibliotecas e frameworks Java. A linguagem Kotlin pode ser compilada para bytecode Java, portanto você pode usá-la em todos os lugares em que Java é utilizada, inclusive no Android. Com um compilador eficiente e uma pequena biblioteca-padrão, Kotlin praticamente não impõe nenhum overhead em tempo de execução.
Kotlin em ação ensina você a usar a linguagem Kotlin em aplicações com qualidade compatível para ambientes de produção. Escrito para desenvolvedores com experiência em Java, este livro repleto de exemplos vai além da maioria dos livros sobre linguagens de programação, incluindo tópicos interessantes como construção de DSLs com sintaxe de linguagem natural. Os autores são desenvolvedores do núcleo de Kotlin, portanto você poderá estar certo de que mesmo os detalhes mais intrincados serão apresentados com extrema precisão.
O que o livro contém:
programação funcional na JVM;
como escrever um código claro e idiomático;
como combinar Kotlin e Java;
linguagens de domínio específico.
Sumário
Sumário
- Apresentação
- Prefácio
- Agradecimentos
- Sobre este livro
- Sobre os autores
- Sobre a ilustração da capa
- Parte I Introdução à Kotlin
- Capítulo 1 ■ Kotlin: o que é e por quê
- 1.1 Uma amostra de Kotlin
- 1.2 Principais características de Kotlin
- executada
- 1.2.2 Tipagem estática
- 1.2.3 Programação funcional e orientada a objetos
- 1.2.4 Código gratuito e aberto
- 1.3 Aplicações Kotlin
- 1.3.1 Kotlin do lado do servidor
- 1.3.2 Kotlin no Android
- 1.4 Filosofia de Kotlin
- 1.4.1 Pragmática
- 1.4.2 Concisa
- 1.4.3 Segura
- 1.4.4 Possibilita interoperabilidade
- 1.5 Usando as ferramentas de Kotlin
- 1.5.1 Compilando código Kotlin
- 1.5.2 Plug-in para IntelliJ IDEA e Android Studio
- 1.5.3 Shell interativo
- 1.5.4 Plug-in para Eclipse
- 1.5.5 Playground online
- 1.5.6 Conversor de Java para Kotlin
- 1.6 Resumo
- Capítulo 2 ■ Básico sobre Kotlin
- 2.1 Elementos básicos: funções e variáveis
- 2.1.1 Hello, world!
- 2.1.3. Variáveis
- 2.1.4 Formatação de strings simplificada: templates de string
- 2.2 Classes e propriedades
- 2.2.1 Propriedades
- 2.2.2 Métodos de acesso personalizados
- 2.2.3 Layout do código-fonte de Kotlin: diretórios e pacotes
- 2.3 Representando e tratando opções: enums e “when”
- 2.3.1 Declarando classes enum
- 2.3.2 Usando “when” para lidar com classes enum
- 2.3.3 Usando when com objetos arbitrários
- 2.3.4 Usando “when” sem argumentos
- 2.3 Casts inteligentes: combinando verificações de tipo e casts
- 2.3.6 Refatoração: substituindo if por when
- 2.3.7 Blocos como ramos de if e de when
- 2.4 Iterando por itens: laços while e for
- 2.4.1 Laço while
- 2.4.2 Iterando por números: intervalos e progressões
- 2.4.3 Iterando por mapas
- 2.4.4 Usando in para verificar a pertinência a uma coleção ou um intervalo
- 2.5 Exceções em Kotlin
- 2.5.1 try, catch e finally
- 2.5.2 try como uma expressão
- 2.6 Resumo
- Capítulo 3 ■ Definindo e chamando funções
- 3.1 Criando coleções em Kotlin
- 3.2 Facilitando a chamada de funções
- 3.2.1 Argumentos nomeados
- 3.2.2 Valores default de parâmetros
- 3.3 Adicionando métodos às classes de outras pessoas: funções de extensão e propriedades
- 3.3.1 Importações e funções de extensão
- 3.3.2 Chamando funções de extensão a partir de Java
- 3.3.3 Funções utilitárias como extensões
- 3.3.4 Sem sobrescritas para funções de extensão
- 3.3.5 Propriedades de extensão
- 3.4 Trabalhando com coleções: varargs, chamadas infixas e suporte de biblioteca
- 3.4.1 Estendendo a API de coleções de Java
- 3.4.2 Varargs: funções que aceitam um número arbitrário de argumentos
- 3.4.3 Trabalhando com pares: chamadas infixas e declarações desestruturantes
- 3.5 Trabalhando com strings e expressões regulares
- 3.5.1 Separando strings
- 3.5.2 Expressões regulares e strings com aspas triplas
- 3.5.3 Strings multilinha com aspas triplas
- 3.6 Deixando seu código organizado: funções locais e extensões
- 3.7 Resumo
- Capítulo 4 ■ Classes, objetos e interfaces
- 4.1 Definindo hierarquias de classes
- 4.1.1 Interfaces em Kotlin
- 4.1.2 Modificadores open, final e abstract: final por padrão
- 4.1.3 Modificadores de visibilidade: public por padrão
- 4.1.4 Classes internas e aninhadas: aninhadas por padrão
- 4.1.5 Classes seladas: definindo hierarquias de classe restritas
- 4.2 Declarando uma classe com construtores ou propriedades não triviais
- 4.2.1 Inicializando classes: construtor primário e blocos de inicialização
- 4.2.2 Construtores secundários: inicializando a superclasse de modos diferentes
- 4.2.3 Implementando propriedades declaradas em interfaces
- 4.2.4 Acessando um backing field a partir de um getter ou de um setter
- 4.2.5 Alterando a visibilidade de um método de acesso
- 4.3 Métodos gerados pelo compilador: classes de dados e delegação de classe
- 4.3.1 Métodos universais de objetos
- 4.3.3 Delegação de classe: usando a palavra reservada “by”
- mo tempo
- 4.4.1 Declarações de objetos: simplificando os singletons
- 4.4.3 Objetos companheiros como objetos comuns
- 4.4.4 Expressões de objeto: uma nova versão das classes internas anônimas
- 4.5 Resumo
- Capítulo 5 ■ Programação com lambdas
- 5.1 Expressões lambda e referências a membros
- 5.1.1 Introdução às lambdas: blocos de código como parâmetros de função
- 5.1.2 Lambdas e coleções
- 5.1.3 Sintaxe das expressões lambda
- 5.1.4 Acessando variáveis no escopo
- 5.1.5 Referências a membros
- 5.2 APIs funcionais para coleções
- 5.2.1 Funções essenciais: filter e map
- 5.2.2 all, any, count e find: aplicando um predicado a uma coleção
- 5.2.3 groupBy: convertendo uma lista em um mapa de grupos
- 5.2.4 flatMap e flatten: processando elementos em coleções aninhadas
- 5.3 Operação lazy em coleções: sequências
- 5.3.1 Executando operações em sequências: operações intermediárias e terminais
- 5.3.2 Criando sequências
- 5.4 Usando interfaces funcionais de Java
- 5.4.1 Passando uma lambda como parâmetro a um método Java
- 5.5 Lambdas com receptores: “with” e “apply”
- 5.5.1 Função “with”
- 5.5.2 Função apply
- 5.6 Resumo
- Capítulo 6 ■ Sistema de tipos de Kotlin
- 6.1 Nulidade
- 6.1.1 Tipos nullable
- 6.1.2 O significado de tipos
- 6.1.3 Operador de chamada segura: “? ”
- 6.1.4 O operador Elvis: “?:”
- 6.1.5 Casts seguros: “as?”
- 6.1.6 Asserções de não null: “!!”
- 6.1.7 A função “let”
- 6.1.8 Propriedades iniciadas tardiamente
- 6.1.9 Extensões para tipos nullable
- 6.1.10 Nulidade em parâmetros de tipo
- 6.1.11 Nulidade e Java
- 6.2 Tipos primitivos e outros tipos básicos
- 6.2.1 Tipos primitivos: Int, Boolean e outros
- 6.2.2 Tipos primitivos nullable: Int?, Boolean? e outros
- 6.2.3 Conversões de números
- 6.2.4 Any e Any?: os tipos raiz
- 6.2.5 O tipo Unit: o “void” de Kotlin
- 6.2.6 Tipo Nothing: “Essa função jamais retorna”
- 6.3 Coleções e arrays
- 6.3.1 Nulidade e coleções
- 6.3.2 Coleções somente para leitura e coleções mutáveis
- 6.3.3 Coleções de Kotlin e Java
- 6.3.4 Coleções como tipos de plataforma
- 6.3.5 Arrays de objetos e de tipos primitivos
- 6.4 Resumo
- Parte II Adotando Kotlin
- Capítulo 7 ■ Sobrecarga de operadores e outras convenções
- 7.1 Sobrecarregando operadores aritméticos
- 7.1.1 Sobrecarregando operações aritméticas binárias
- 7.1.2 Sobrecarregando operadores de atribuição compostos
- 7.1.3 Sobrecarregando operadores unários
- 7.2 Sobrecarregando operadores de comparação
- 7.2.1 Operadores de igualdade: “equals”
- 7.2.2 Operadores de ordenação: compareTo
- 7.3 Convenções usadas em coleções e intervalos
- 7.3.1 Acessando elementos pelo índice: “get” e “set”
- 7.3.2 A convenção “in”
- 7.3.3 Convenção rangeTo
- 7.3.4 Convenção iterator para o laço for
- 7.4 Declarações desestruturantes e funções componentes
- 7.4.1 Declarações desestruturantes e laços
- 7.5.1 Propriedades delegadas: o básico
- 7.5.2 Usando propriedades delegadas: inicialização lazy e “by lazy()”
- 7.5.3 Implementando propriedades delegadas
- 7.5.4 Regras para tradução de propriedades delegadas
- 7.5.5 Armazenando valores de propriedades em um mapa
- 7.5.6 Propriedades delegadas em frameworks
- 7.6 Resumo
- Capítulo 8 ■ Funções de alta ordem: lambdas como parâmetros e valores de retorno
- 8.1 Declarando funções de alta ordem
- 8.1.1 Tipos função
- 8.1.2 Chamando funções passadas como argumentos
- 8.1.3 Usando tipos função a partir de Java
- 8.1.4 Valores default e null para parâmetros com tipos função
- 8.1.5 Devolvendo funções a partir de funções
- 8.1.6 Removendo duplicações usando lambdas
- 8.2 Funções inline: eliminando o overhead das lambdas
- 8.2.1 Como o inline funciona
- 8.2.2 Restrições para funções inline
- 8.2.3 Usando operações de coleção como inline
- 8.2.4 Decidindo quando as funções devem ser declaradas como inline
- 8.2.5 Usando lambdas inline para gerenciamento de recursos
- 8.3 Fluxo de controle em funções de alta ordem
- 8.3.1 Instruções return em lambdas: retornando de uma função que a engloba
- 8.3.2 Retornando de lambdas: return com um rótulo
- 8.3.3 Funções anônimas: retornos locais por padrão
- 8.4 Resumo
- Capítulo 9 ■ Genéricos
- 9.1 Parâmetros de tipo para genéricos
- 9.1.1 Funções e propriedades genéricas
- 9.1.2 Declarando classes genéricas
- 9.1.3 Restrições para parâmetros de tipo
- 9.1.4 Fazendo com que os parâmetros de tipo sejam não null
- 9.2 Genéricos em tempo de execução: parâmetros de tipo apagados e reificados
- 9.2.1 Genéricos em tempo de execução: verificações de tipo e casts
- 9.2.2 Declarando funções com parâmetros de tipo reificados
- 9.2.3 Substituindo referências a classes por parâmetros de tipo reificados
- 9.2.4 Restrições para os parâmetros de tipo reificados
- 9.3 Variância: genéricos e subtipagem
- 9.3.1 Por que a variância existe: passando um argumento para uma função
- 9.3.2 Classes, tipos e subtipos
- 9.3.3 Covariância: relação de subtipagem preservada
- 9.3.4 Contravariância: relação inversa de subtipagem
- 9.3.6 Projeção com asterisco: usando * no lugar de um argumento de tipo
- 9.4 Resumo
- Capítulo 10 ■ Anotações e reflexão
- 10.1 Declarando e aplicando anotações
- 10.1.1 Aplicando anotações
- 10.1.2 Alvos das anotações
- 10.1.3 Usando anotações para personalizar a serialização de JSON
- 10.1.4 Declarando anotações
- 10.1.5 Meta-anotações: controlando o processamento de uma anotação
- 10.1.6 Classes como parâmetros de anotações
- 10.1.7 Classes genéricas como parâmetros de anotações
- 10.2 Reflexão: introspecção de objetos Kotlin em tempo de execução
- 10.2.1 A API de reflexão Kotlin: KClass, KCallable, KFunction e KProperty
- 10.2.2 Implementando a serialização de objetos usando reflexão
- 10.2.3 Personalizando a serialização com anotações
- 10.2.4 Parsing de JSON e desserialização de objetos
- 10.3 Resumo
- Capítulo 11 ■ Construção de DSLs
- 11.1 De APIs a DSLs
- 11.1.1 O conceito de linguagens de domínio específico
- 11.1.2 DSLs internas
- 11.1.3 Estrutura das DSLs
- 11.1.4 Construindo HTML com uma DSL interna
- 11.2 Construindo APIs estruturadas: lambdas com receptores em DSLs
- 11.2.1 Lambdas com receptores e tipos função de extensão
- 11.2.2 Usando lambdas com receptores em builders de HTML
- 11.2.3 Builders de Kotlin: possibilitando abstração e reutilização
- 11.3 Blocos aninhados de modo mais flexível usando a convenção “invoke”
- 11.3.1 A convenção “invoke”: objetos callable como funções
- 11.3.2 A convenção “invoke” e os tipos funcionais
- 11.3.3 A convenção “invoke” em DSLs: declarando dependências no Gradle
- 11.4 DSLs em Kotlin na prática
- 11.4.1 Encadeando chamadas infixas: “should” em frameworks de teste
- 11.4.2 Definindo extensões em tipos primitivos: tratando datas
- 11.4.3 Funções de extensão membros: DSL interna para SQL
- 11.4.4 Anko: criando UIs para Android dinamicamente
- 11.5 Resumo
- Apêndice A ■ Construindo projetos em Kotlin
- A 1 Construção de código Kotlin com o Gradle
- A 1.1 Construindo aplicações Android em Kotlin com o Gradle
- A 1.2 Construindo projetos que usam processamento de anotações
- A 2 Construção de projetos Kotlin com o Maven
- A 3 Construção de código Kotlin com o Ant
- Apêndice B ■ Documentação de código Kotlin
- B 1 Escrevendo comentários para documentação de Kotlin
- B 2 Gerando a documentação da API
- Apêndice C ■ Ecossistema de Kotlin
- C 1 Testes
- C 2 Injeção de dependências
- C 3 Serialização de JSON
- C 4 Clientes HTTP
- C 5 Aplicações web
- C 6 Acesso a banco de dados
- C 7 Utilitários e estruturas de dados
- C 8 Programação para desktop
Livros relacionados
Recursos
Opinião dos leitores
Washington M da S
Recomendo, uma ótima leitura, de fácil compreensão.
Halyson L G
Muito boa a tradução. Espero que façam também do livro Android Security.


