Este artigo apresenta a Streams API, uma das novidades do Java 8 que traz facilidades e melhorias para o processamento de elementos em coleções. Com o uso da Streams API, as operações passam a ser pensadas sobre “o que fazer”, ao invés do “como fazer”. Essa abordagem é possível devido a abstrações que encapsulam operações comuns realizadas sobre coleções.
Assim como a API Collections, amplamente adotada hoje em dia e que faz parte do cotidiano dos desenvolvedores Java, muito em breve a Streams API atingirá este nível de adoção por causa das suas características complementares à API Collections, fazendo com que o aprendizado e o domínio dessa nova API sejam essenciais.
A Streams API é uma das grandes novidades do Java 8. Diretamente relacionada com a API Collections, fornece suporte a uma série de operações sobre coleções de dados e, conforme o avanço da adoção da plataforma Java 8, muito em breve seu uso estará bastante difundido entre desenvolvedores, da mesma forma que a API Collections.
Como sabemos, o número de aplicações Java que fazem uso de recursos da API Collections é bastante elevado, pois coleções são fundamentais em muitas tarefas de processamento de dados. Um exemplo de tarefa comum envolvendo Collections é a criação de coleções de dados e seu posterior processamento como, por exemplo, uma coleção de ordens de venda em um sistema de comércio eletrônico e o processamento dessas ordens para obter o valor total das vendas. Para realizar esse processamento, seria necessário percorrer toda a coleção em um laço e, com a ajuda de uma variável temporária, somar cada valor para obter o total.
Assim, podemos concluir que a tarefa de percorrer e realizar uma operação em cada elemento de uma coleção é um padrão de processamento. Em um banco de dados relacional, por outro lado, para obter o valor total das ordens de venda seria necessário algo como SELECT SUM(orders.total) FROM orders. Note que não é necessário percorrer todos os registros e muito menos implementar como calcular o valor total, pois tudo é feito de forma declarativa em termos do que se é esperado. Agora, como fazer isso com Collections e poupar bastante trabalho, eliminando a implementação de laços para processamento de coleções? Este é um dos problemas que a Streams API, da plataforma Java 8, vem resolver.
Outra questão ao lidar com o processamento de coleções está relacionada à eficiência do processamento. Para melhorar a performance do processamento o ideal seria o uso de paralelismo, embora código paralelo seja mais difícil de escrever e sujeito a erros. Pensando nisso, a Streams API também traz recursos para lidar com essa questão. Ao fornecer uma abstração que permite o processamento de coleções de forma declarativa, além de possibilitar que o processamento seja realizado de forma paralela sem a necessidade de código adicional, Streams API muda o jeito como coleções de dados são processadas.
Como motivação para o aprendizado e para ter uma ideia de como a Streams API funciona, considere a Listagem 1, que mostra como obter o valor total das ordens de compra em uma determinada lista. O cálculo é feito por meio de um laço que itera por todos os elementos da lista, o valor de cada ordem é recuperado e somado em uma variável temporária. Quando toda a lista é iterada, tem-se o valor total das ordens de compra da lista.
public double getOrdersTotal(List<Order> orders) {
double ordersTotal = 0.0;
for(Order order : orders) {
ordersTotal = ordersTotal + order.getTotal();
}
return ordersTotal;
}
Agora considere a Listagem 2, que obtém o mesmo resultado, entretanto, fazendo uso da Streams API. Note como as coisas ficaram bem mais simples e o código muito mais natural para se ler. Neste momento, não se preocupe em entender todo o código dessa listagem. O objetivo agora é mostrar o quão conciso se torna o código com a Streams API. Os detalhes do que essa linha de código faz serão abordados adiante.
Double ordersTotal = orders.stream().mapToDouble((order) -> order.getValue()).sum();
As próximas seções deste artigo apresentam todos os detalhes da Streams API, começando de forma conceitual mostrando o que é uma stream, até a prática de como criar streams e realizar operações sobre as mesmas.
Streams
Para a Streams API, uma Stream pode ser definida, de forma sucinta, como uma sequência de elementos de uma fonte de dados que suporta operações de agregação. A abordagem de trabalho da Streams API é a conversão de uma >coleção, array ou recursos I/O (entrada e saída de dados) em uma Stream, o processamento dos dados e a devolução dos dados em uma nova coleção ou valor reduzido (map-reduce).
Uma Stream fornece uma interface para acesso sequencial aos elementos da mesma, que são de determinado tipo. Streams podem ser criadas a partir de coleções, arrays e I/O, mas não armazenam os elementos, que são processados sob demanda, com operações parecidas com as funções da SQL e operações comuns em linguagens de programação funcional, como filter(), map(), reduce(), find( ...
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.