Explorando Streams em Java
As streams em Java, introduzidas no Java 8, fornecem uma poderosa abstração para processamento de dados em coleções. Este artigo explora as streams, suas operações, conceitos fundamentais e como tirar o máximo proveito dessa funcionalidade.
O Que São Streams?
Em termos simples, uma stream é uma sequência de elementos que suporta várias operações para processamento desses elementos. As streams em Java proporcionam uma maneira mais eficiente e concisa de lidar com coleções de dados.
Criando Streams
Existem várias maneiras de criar streams em Java. Algumas das formas comuns incluem:
// A partir de uma coleção
List<String> lista = Arrays.asList("Java", "é", "poderoso");
Stream<String> streamDaLista = lista.stream();
// A partir de valores individuais
Stream<String> streamDeValores = Stream.of("Java", "é", "poderoso");
// A partir de um array
String[] array = {"Java", "é", "poderoso"};
Stream<String> streamDoArray = Arrays.stream(array);
Operações Intermediárias e Terminais
As operações em streams são divididas em duas categorias: intermediárias e terminais.
Operações Intermediárias
Operações intermediárias são aquelas que transformam ou filtram os elementos da stream, mas não produzem um resultado final imediatamente. Algumas operações intermediárias comuns incluem filter, map e distinct.
List<String> palavras = Arrays.asList("Java", "é", "poderoso");
// Filtrar palavras com mais de 3 letras
Stream<String> palavrasFiltradas = palavras.stream().filter(p -> p.length() > 3);
// Transformar palavras para minúsculas
Stream<String> palavrasMinusculas = palavras.stream().map(String::toLowerCase);
Operações Terminais
Operações terminais são aquelas que produzem um resultado final ou realizam uma ação final na stream. Algumas operações terminais comuns incluem forEach, collect e reduce.
List<String> palavras = Arrays.asList("Java", "é", "poderoso");
// Imprimir cada palavra
palavras.stream().forEach(System.out::println);
// Coletar palavras em uma lista
List<String> listaDePalavras = palavras.stream().collect(Collectors.toList());
Conceitos Importantes
Lazy Evaluation
Streams em Java utilizam o conceito de avaliação preguiçosa (lazy evaluation), o que significa que as operações não são realizadas imediatamente, mas somente quando um resultado final é necessário. Isso contribui para a eficiência e economia de recursos.
Parallel Streams
Uma das vantagens das streams é a capacidade de processamento paralelo. O método parallelStream() permite que as operações sejam executadas em paralelo, explorando o poder de processadores multi-core.
List<String> palavras = Arrays.asList("Java", "é", "poderoso");
// Processamento paralelo para contar o número de letras
long totalLetras = palavras.parallelStream().mapToLong(String::length).sum();
As streams em Java são uma adição valiosa ao kit de ferramentas dos desenvolvedores, proporcionando uma abordagem elegante e funcional para o processamento de dados em coleções. Ao compreender os conceitos de operações intermediárias, terminais e outros recursos, os desenvolvedores podem escrever código mais eficiente e expressivo. Explore as streams em seus projetos Java e aproveite os benefícios da programação funcional.