




























































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Como utilizar interfaces funcionais em java, como consumer, predicate e comparator, para simplificar a manipulação de objetos e coleções. Também aborda a utilização de métodos estáticos e de referência de métodos em interfaces funcionais.
Tipologia: Manuais, Projetos, Pesquisas
1 / 137
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























































































Casa do Código
“À família Alexandre Vulcano”
“À minha amada esposa”
i
Casa do Código
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 par- ticipações na lista. Alberto Souza, Francisco Sokol, Guilherme Silveira, Michael Nas- cimento e Osvaldo Duoderlein são alguns deles. Agradecimento especial a Alexan- dre 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 bibliote- cas.
iii
Capítulo 1
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 possibili- dades 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://download.java.net/jdk8/docs/api/index.html O Eclipse possui suporte para o Java 8 a partir da versão Luna (4.4). O Kepler (4.3) precisa do seguinte update:
1.1. Um balde de água morna? Casa do Código
https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler O Eclipse ainda possui alguns pequenos bugs para realizar inferências mais com- plicadas. 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.
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 desenvol- vedores 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 utiliza- das. 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, cer- tamente têm um papel crucial nessa elegante evolução.
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/ 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/ Assim como o uso de literais para trabalhar com coleções: http://openjdk.java.net/jeps/ 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.
2
Capítulo 2
Em vez de começar com uma boa dose de teoria, é importante que você sinta na prática como o Java 8 vai mudar a forma com que você programa.
É importante que você acompanhe o livro recriando o código daqui. Só assim a sintaxe tornar-se-á natural e mais próxima de você. Abra seu editor preferido. Vamos criar uma entidade para poder rodar exemplos baseados nela. Teremos a classe Usuario, com três atributos básicos: pontos, nome e um boolean moderador, indicando se aquele usuário é um moderador do nosso sistema. Simples assim:
class Usuario { private String nome; private int pontos; private boolean moderador;
Casa do Código Capítulo 2. Olá, Lambda!
} } }
Omitimos dois imports: do java.util.List e do java.util.Arrays. Du- rante o livro, eles não vão aparecer, mas notaremos sempre que aparecerem novos pacotes do Java 8. Arrays.asList é uma maneira simples de criar uma List imutável. Mas você poderia sim ter criado uma nova ArrayList e adicionado cada um dos usuários. O for que fazemos é trivial. Desde o Java 5, podemos navegar assim em qual- quer array ou coleção (na verdade, em qualquer tipo de objeto que implemente a interface java.lang.Iterable).
A partir do Java 8 temos acesso a um novo método nessa nossa lista: o forEach. De onde ele vem? Veremos mais adiante. Iniciaremos por utilizá-lo. Podemos fazer algo como:
usuarios.forEach(...);
Para cada usuário, o que ele deve fazer? Imprimir o nome. Mas qual é o argu- mento que esse método forEach recebe? Ele recebe um objeto do tipo java.util.function.Consumer, que tem um único método, o accept. Ela é uma nova interface do Java 8, assim como todo o pacote do java.util.function, que conheceremos no decorrer do livro. Vamos criar esse consumidor, antes de usar o novo forEach:
class Mostrador implements Consumer
Criamos uma classe que implementa essa nova interface do Java 8. Ela é bem trivial, possuindo o único método accept responsável por pegar um objeto do tipo Usuario e consumi-lo. ‘Consumir’ aqui é realizar alguma tarefa que faça sentido pra você. No nosso caso, é mostrar o nome do usuário na saída padrão. Depois disso, podemos instanciar essa classe e passar a referência para o esperado método forEach:
7
2.2. Que entre o Lambda! Casa do Código
Mostrador mostrador = new Mostrador(); usuarios.forEach(mostrador);
Sabemos que é uma prática comum utilizar classes anônimas para essas tarefas mais simples. Em vez de criar uma classe Mostrador só pra isso, podemos fazer tudo de uma tacada só:
Consumer
usuarios.forEach(mostrador);
Isso vai acabar gerando um .class com nome estranho, como por exem- plo Capitulo2$1.class. Como não podemos nos referenciar a um nome dessa classe, chamamo-la de classe anônima, como já deve ser de seu conhecimento. O código ainda está grande. Parece que o for de maneira antiga era mais su- cinto. Podemos reduzir um pouco mais esse código, evitando a criação da variável local mostrador:
usuarios.forEach(new Consumer
Pronto! Um pouco mais enxuto, mas ainda assim bastante verboso.
Simplificando bastante, um lambda no Java é uma maneira mais simples de imple- mentar uma interface que só tem um único método. No nosso caso, a interface Consumer é uma boa candidata. Isto é, em vez de escrever:
Consumer
8
2.2. Que entre o Lambda! Casa do Código
usuarios.forEach(u -> u.tornaModerador());
Vale lembrar que essa variável u não pode ter sido declarada no mesmo escopo da invocação do forEach, pois o lambda pode capturar as variáveis de fora, como veremos mais adiante. No próximo capítulo vamos trabalhar mais com lambda, para exercitar a sin- taxe, além de conhecer outros cenários básicos de seu uso junto com o conceito de interface funcional.
Capítulo 3
Repare que a interface Consumer
usuarios.forEach(u -> System.out.println(u.getNome()));
Mas e se a interface Consumer
public interface Runnable { public abstract void run(); }