Introdução a API de Streams do Java

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;
}
}
view raw Livro.java hosted with ❤ by GitHub
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 LivroStreamsExemplo.

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 🙂 !

4 comentários em “Introdução a API de Streams do Java”

Deixar mensagem para Emanuel Cancelar resposta