Java 8 Prático Lambdas, Streams e os novos recursos da linguagem
Paulo Silveira, Rodrigo TuriniJava 8 Prático
Agradecimentos
Foi um desafio escrever um livro durante seis meses em que o JDK8 final ainda não existia.
Fica um agradecimento a todos que nos ajudaram com dúvidas, sugestões e participações na lista. Alberto Souza, Francisco Sokol, Guilherme Silveira, Michael Nascimento e Osvaldo Duoderlein são alguns deles. Agradecimento especial a Alexandre Aquiles, pelas correções e sugestões importantes durante a detalhada revisão.
Um muito obrigado a todos os desenvolvedores do JDK8, que em muitas vezes responderam nossas dúvidas prontamente. Destaque para o Brian Goetz, líder do projeto Lambda e sempre muito solícito.
Um abraço a todos da Caelum, do Alura e da Casa do Código. São equipes que nos incentivam todos os dias a investigar novas tecnologias, paradigmas e bibliotecas.
Sumário
- 1 - Java 8
- 1.1 - Um balde de água morna?
- 1.2 - Acesse o código desse livro e discuta com a gente!
- 2 - Olá, Lambda!
- 2.1 - Loops da maneira antiga e da maneira nova
- 2.2 - Que entre o Lambda!
- 3 - Interfaces funcionais
- 3.1 - Outro exemplo: listeners
- 3.2 - Sua própria interface funcional
- 3.3 - A anotação @FunctionalInterface
- 3.4 - Indo mais a fundo: primeiros detalhes
- 4 - Default Methods
- 4.1 - O método forEach na interface Iterable
- 4.2 - A interface Consumer não tem só um método!
- 4.3 - Mais um novo método em Collection: removeIf
- 4.4 - Herança múltipla?
- 5 - Ordenando no Java 8
- 5.1 - Comparators como lambda
- 5.2 - O método List.sort
- 5.3 - Métodos estáticos na interface Comparator
- 5.4 - Conhecendo melhor o Comparator.comparing
- 5.5 - Ordenando por pontos e o autoboxing
- 6 - Method References
- 6.1 - Tornando todos os usuários moderadores
- 6.2 - Comparando de uma forma ainda mais enxuta
- 6.3 - Compondo comparators
- 6.4 - Referenciando métodos de instância
- 6.5 - Referenciando métodos que recebem argumentos
- 6.6 - Referenciando construtores
- 6.7 - Outros tipos de referências
- 7 - Streams e Collectors
- 7.1 - Tornando moderadores os 10 usuários com mais pontos
- 7.2 - Streams: tornando moderadores os usuários com mais de 100 pontos
- 7.3 - Como obter de volta uma Lista?
- 7.4 - Collectors
- 7.5 - Avançado: por que não há um toList em Stream?
- 7.6 - Liste apenas os pontos de todos os usuários com o map
- 7.7 - IntStream e a família de Streams
- 7.8 - O Optional em java.util
- 8 - Mais operações com Streams
- 8.1 - Ordenando um Stream
- 8.2 - Muitas operações no Stream são lazy!
- 8.3 - Qual é a vantagem dos métodos serem lazy?
- 8.4 - Enxergando a execução do pipeline com peek
- 8.5 - Operações de redução
- 8.6 - Conhecendo mais métodos do Stream
- 8.7 - Streams primitivos e infinitos
- 8.8 - Praticando o que aprendemos com java.nio.file.Files
- 8.9 - FlatMap
- 9 - Mapeando, particionando, agrupando e paralelizando
- 9.1 - Coletores gerando mapas
- 9.2 - groupingBy e partitioningBy
- 9.3 - Executando o pipeline em paralelo
- 9.4 - Operações não determinísticas e ordered streams
- 10 - Chega de Calendar! Nova API de datas
- 10.1 - A java.time vem do Joda Time
- 10.2 - Trabalhando com datas de forma fluente
- 10.3 - Enums no lugar de constantes
- 10.4 - Formatando com a nova API de datas
- 10.5 - Datas inválidas
- 10.6 - Duração e Período
- 10.7 - Diferenças para o Joda Time
- 11 - Um modelo de pagamentos com Java 8
- 11.1 - Uma loja de digital goodies
- 11.2 - Ordenando nossos pagamentos
- 11.3 - Reduzindo BigDecimal em somas
- 11.4 - Produtos mais vendidos
- 11.5 - Valores gerados por produto
- 11.6 - Quais são os produtos de cada cliente?
- 11.7 - Qual é nosso cliente mais especial?
- 11.8 - Relatórios com datas
- 11.9 - Sistema de assinaturas
- 12 - Apêndice: mais Java 8 com reflection, JVM, APIs e limitações
- 12.1 - Novos detalhes na linguagem
- 12.2 - Qual é o tipo de uma expressão Lambda?
- 12.3 - Limitações da inferência no lambda
- 12.4 - Fim da Permgen
- 12.5 - Reflection: parameter names
- 13 - Continuando seus estudos
- 13.1 - Como tirar suas dúvidas
- 13.2 - Bibliotecas que já usam ou vão usar Java 8
Java 8
São praticamente 20 anos de Java desde o lançamento de sua primeira versão.
Apenas em 2004, com a chegada do Java 5, houve mudanças significativas na linguagem. Em especial generics, enums e anotações.
Com a chegada do Java 8, em 2014, isso acontece mais uma vez. Novas possibilidades surgem com a entrada do lambda e dos method references, além de pequenas mudanças na linguagem. A API de Collections, na qual as interfaces principais são as mesmas desde 1998, recebe um significativo upgrade com a entrada dos Streams e dos métodos default.
Tudo isso será extensivamente praticado durante o livro. É hora de programar. Você deve baixar e instalar o Java 8:
http://www.oracle.com/technetwork/java/javase/downloads/
E pode acessar seu javadoc aqui:
http://docs.oracle.com/javase/8/docs/api/
O Eclipse possui suporte para o Java 8 a partir da versão Luna (4.4). O Kepler (4.3) precisa do seguinte update:
https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler
O Eclipse ainda possui alguns pequenos bugs para realizar inferências mais complicadas. Netbeans e IntelliJ tem suas versões atualizadas para Java 8.
Para fixar a sintaxe, você pode optar por realizar os testes e exemplos do livro com um simples editor de texto.
1.1 - Um balde de água morna?
Se você está esperando algo tão poderoso quanto em Scala, Clojure e C#, certamente sairá decepcionado. O legado e a idade do Java, além da ausência de value types e reificação nos generics, impedem o uso de algumas estratégias. O time de desenvolvedores da linguagem tem também grande preocupação em deixar a sintaxe sempre simples, evitando formas obscuras que trariam pequenos ganhos. Na nossa opinião, faz bastante sentido.
Ao mesmo tempo é impressionante o que foi possível atingir com o lançamento dessa nova versão. Você vai se surpreender com alguns códigos e abordagens utilizadas. O foco é não quebrar a compatibilidade do código antigo e ser o menos intrusivo possível nas antigas APIs. Os Streams
, que serão vistos quase que a exaustão, certamente têm um papel crucial nessa elegante evolução.
O que ficou de fora do Java 8?
Para quebrar melhor a especificação do Java 8 em tarefas menores, foram criadas as JEPs: JDK Enhancement Proposals. É uma ideia que nasceu dos PEPs, proposta similar da comunidade Python. A JEP 0 é uma lista com todas essas propostas:
http://openjdk.java.net/jeps/0
Como você pode ver, são muitas as novidades no JDK8. Infelizmente nem todas tiveram tempo suficiente para amadurecer. Entre as JEPs propostas, os Value Objects ficaram de fora:
http://openjdk.java.net/jeps/169
Assim como o uso de literais para trabalhar com coleções:
http://openjdk.java.net/jeps/186
Entre outras ideias que ficaram de fora, temos diversas melhorias aos Garbage Collectors já embutidos, assim como a possível reificação dos generics.
De qualquer maneira, a maioria absoluta das JEPs sobreviveu até o lançamento da versão final. Veremos as principais mudanças da linguagem, assim como as novas APIs, no decorrer do livro.
1.2 - Acesse o código desse livro e discuta com a gente!
O código-fonte para cada capítulo pode ser encontrado aqui:
É claro que indicamos que você mesmo escreva todo o código apresentado no livro, para praticar a API e a sintaxe, além de realizar testes diferentes dos sugeridos.
Há uma lista de discussão por onde você pode conversar com a gente, mandar sugestões, críticas e melhorias:
https://groups.google.com/forum/#!forum/java8-casadocodigo
Se preferir, você pode tirar dúvidas no fórum do GUJ:
Dados do produto
- Número de páginas:
- 151
- ISBN:
- 978-85-66250-46-6
- Data publicação:
- 03/2014