Use o código e tenha 10% de desconto!

Java 8 Prático Lambdas, Streams e os novos recursos da linguagem

Paulo Silveira, Rodrigo Turini
Capa

Java 8 Prático

"À família Alexandre Vulcano" "À minha amada esposa"

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
Capítulo1

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:

https://github.com/peas/java8

É 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:

http://www.guj.com.br/

Dados do produto

Número de páginas:
148
ISBN:
978-85-66250-46-6
Data publicação:
03/2014

Compartilhe!

Compartilhe no Facebook Compartilhe no Twitter