A API de streams do java nos permite trabalhar com collections de maneira mais simples, com stream o processamento das collections será de forma funcional declarativa, diferente da forma imperativa na qual estamos acostumados a trabalhar até as versões anteriores ao Java 8.
Stream pode ser definida como uma sequência de elementos de uma fonte de dados que oferece suporte a diferentes tipos de operações.
Para demonstrar o uso da API preparei um simples exemplo para filtrar livros, obter o preço do livro mais caro, mais barato , média dos preços…
Abaixo segue o código para exemplificar como podemos utilizar a API:
| package streams; | |
| public class Livro { | |
| private String nome; | |
| private Double preco; | |
| public Livro(String nome, Double preco) { | |
| this.nome = nome; | |
| this.preco = preco; | |
| } | |
| public String getNome() { | |
| return nome; | |
| } | |
| public void setNome(String nome) { | |
| this.nome = nome; | |
| } | |
| public Double getPreco() { | |
| return preco; | |
| } | |
| public void setPreco(Double preco) { | |
| this.preco = preco; | |
| } | |
| @Override | |
| public String toString() { | |
| return "Livro nome: " + nome + ", preco: R$" + preco; | |
| } | |
| } |
| package streams; | |
| import java.util.Arrays; | |
| import java.util.DoubleSummaryStatistics; | |
| import java.util.List; | |
| public class StreamsExemplo { | |
| static List<Livro> livros = Arrays.asList( | |
| new Livro("O senhor dos anéis", 30.0), | |
| new Livro("As crônicas de gelo e fogo", 50.0), | |
| new Livro("Harry Potter e a câmara secreta", 25.0), | |
| new Livro("O Hobbit", 30.0), | |
| new Livro("Jogos vorazes", 27.0)); | |
| public static void main(String[] args) { | |
| livros.stream().filter(l -> l.getPreco() > 30).forEach(System.out::println); | |
| livros.stream().filter(l -> l.getPreco() < 30).forEach(System.out::println); | |
| Double precoTotal = livros.stream().mapToDouble(Livro::getPreco).sum(); | |
| System.out.println("Soma dos preços de todos os livros: " + precoTotal); | |
| DoubleSummaryStatistics estatisticas = livros.stream().mapToDouble(Livro::getPreco).summaryStatistics(); | |
| System.out.println("Preço do livro mais caro: "+ estatisticas.getMax()); | |
| System.out.println("Preço do livro mais barato: "+ estatisticas.getMin()); | |
| System.out.println("Soma dos preços de todos os livros: "+ estatisticas.getSum()); | |
| System.out.println("Quantidade dos livros: "+ estatisticas.getCount()); | |
| System.out.println("Média de preço dos livros: "+ estatisticas.getAverage()); | |
| } | |
| } |
Temos a classe Livro e StreamsExemplo.
Na classe StreamsExemplo temos:
Para obtermos os livros com o preço maior do que 30 chamamos o método stream() da interface Collection para poder chamar o método filter(), passamos uma expressão lambda, percorremos por esses objetos com o método foreach e fazemos chamadas em System.out::println usando method references e consequentemente o método toString() do objeto l do tipo Livro será chamado.
livros.stream().filter(l -> l.getPreco() > 30).forEach(System.out::println);
Uma forma para obtermos o preço total de todos os livros seria usando o método mapToDouble(). Com ele podemos aplicar a mesma operação, nesse caso a soma, para todos os preços dos livros que se encontram na coleção, mais uma vez utilizando method references.
Double precoTotal = livros.stream().mapToDouble(Livro::getPreco).sum();
System.out.println(“Soma dos preços de todos os livros: “ + precoTotal);
Também podemos obter outras informações como o preço do livro mais caro e mais barato, a soma de todos os preços, quantidade e média. Para isso basta aplicarmos o mapToDouble novamente na stream e chamar summaryStatistics(), então um DoubleStream é retornado e conseguimos acessar os métodos getMax(), getMin(), getSum(), getAverage().
DoubleSummaryStatistics estatisticas = livros.stream().mapToDouble(Livro::getPreco).summaryStatistics();
System.out.println(“Preço do livro mais caro: “+ estatisticas.getMax());
System.out.println(“Preço do livro mais barato: “+ estatisticas.getMin());
System.out.println(“Soma do preço de todos os livros: “+ estatisticas.getSum());
System.out.println(“Quantidade dos livros: “+ estatisticas.getCount());
System.out.println(“Média de preço dos livros: “+ estatisticas.getAverage());
Para processar um volume maior de dados de forma paralela podemos chamar o método parallelStream() no lugar de stream().
Bom essa foi uma pequena introdução a api de streams, espero que tenha ajudado alguém com este post 🙂 !
Legal, to compartilhando tuas postagens lá no grupo.
https://www.facebook.com/groups/maxigenios/
CurtirCurtido por 1 pessoa
Obrigado Leandro!
CurtirCurtir
Muito bom Matheus! Bem explicado!
CurtirCurtir
Obrigado Emanuel!
CurtirCurtir