A Biblioteca Stream
Streams fornece uma visão dos dados que permite você especificar altos conceitos computacionais mais do que com coleções. Com uma Stream, você especifica o que quer fazer, não como fazer. Você agenda operações para implementações. Por exemplo, suponhamos que você quer a média de uma certa propriedade. Você especifica a fonte de dados e a propriedade, e a biblioteca Stream pode otimizar a computação, por exemplo, utilizar múltiplas threads para computar somas, contas e combinações de resultados.
Interagindo com Operações da Stream
Quando você processa uma coleção, você costuma ler cada elemento da coleção e trabalhar um por um. Por exemplo, suponhamos que nós queremos contar todas as palavras de um livro. Primeiro, temos que colocarmos ele dentro de uma lista.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.nio.*; import java.nio.charset.*; import java.nio.file.*; import java.util.*; public class LerArquivo{ public static void main(String[] args){ try{ // vai ler o arquivo String contents = new String(Files.readAllBytes( Paths.get("alice.txt")), StandardCharsets.UTF_8); // separa as palavras List<String> words = Arrays.asList(contents.split("\\PL+")); System.out.println("words " +words.size()); }catch(Exception e){ System.out.println("ERRO "+e.getMessage()); } } } |
O arquivo alice.txt você pode criar qualquer texto dentro de um bloco de notas.
Agora vamos fazer uma interação:
1 2 3 4 |
long count = 0; for(String w : words){ if(w.length() > 12) count ++; } |
Fazendo a mesma interação utilizando a Streams.
1 2 3 4 |
long count = words.stream() .filter(w -> w.length() > 12) .count(); |
A versão Stream é mais fácil de ler do que a loop, porque você não precisa scanear o código para filtrar e contar. Os nomes dos métodos dizem o que pretendem fazer. Além disso, o While enquanto não terminar os recursos do sistema estão dedicados a ele, a Stream age da mesma maneira, só que temos a opção de agendar a operação.
Simplesmente modificando a Stream para parallelStream para fazer o filtro e a contagem em paralelo.
1 2 3 4 |
long count = words. parallelStream() .filter(w -> w.length() > 12) .count(); |
A Stream segue o princípio do “O que” e não do “Como”. No exemplo, descrevemos o que precisa ser feito: pegue as palavras e conte. Não precisamos especificar a ordem, ou uma thread para que isto fosse feito. Diferente do loop que no começo da tarefa especificamos exatamente como o computador deve trabalhar, e com isto perdemos qualquer chance de otimização.
A Stream parece superficialmente com uma coleção, permite você transformar e capturar os dados. Mas há diferenças significativas:
Uma Stream não armazena os elementos. Eles podem ser armazenados em outro lugar ou serem gerados por demanda.
Operações da Stream não mudam o código fonte. Por exemplo, o método filter não remove os elementos para criar uma nova Stream, mas os campos onde eles estavam ocupando, não existiram mais.
Operações da Stream são lazy quando possível. Isto significa que eles não são executados até que precisem ser. Por exemplo, se você pedir as primeiras palavras de uma lista ao invés de todas, o método filter irá parar de filtrar depois da quinta ocorrência. Com consequência, você pode ter Streams infinitas.
Vamos ver um outro exemplo. Os métodos stream e parallelStream produz interação com as palavras da lista. O método filter retorna outro fluxo que contém apenas palavras maiores que doze. O método count reduz o fluxo do resultado.
Este fluxo é típico quando se trabalha com streams (fluxos). Você configura três estágios de trabalho.
Cria uma stream.
Específica operações intermediarias para transformar o fluxo inicial em outros, possibilitando múltiplos passos.
Aplica uma operação final para produzir o resultado. Esta operação força a execução das operações lazy que as precedem. Depois, o fluxo não pode ser mais utilizado.
No nosso código o fluxo é criado com o método stream ou parallelStream. O método filter faz a transformação e o count realiza a operação final.
Visite a documentação para ver os métodos mencionados.
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import java.nio.*; import java.nio.charset.*; import java.nio.file.*; import java.util.*; public class LerArquivo{ public static void main(String[] args){ try{ // vai ler o arquivo String contents = new String(Files.readAllBytes( Paths.get("alice.txt")), StandardCharsets.UTF_8); // separa as palavras List<String> words = Arrays.asList(contents.split("\\PL+")); System.out.println("words " +words.size()); long count = words.parallelStream() .filter(w -> w.length() > 12) .count(); /* long count = words.stream() .filter(w -> w.length() > 12) .count(); */ /*long count = 0; for(String w : words){ if(w.length() > 12) count ++; }*/ System.out.println("count " +count); }catch(Exception e){ System.out.println("ERRO "+e.getMessage()); } } } |
❤️ Curso Java Para Iniciantes
👍 Curso de Desenvolvimento Web Completo
#java
Deixe um comentário