API_streams - F4NT0/J4V4 GitHub Wiki
- Chamada da API: import java.util.stream
-
São uma abstração para especificação de computações sobre agregações
-
Não deve ser vista como uma estrutura de dados
-
Pode ser infinita
-
Introduz conceitos interessantes(paralelismo,laziness e short-circuit)
-
A noção essencial é de um pipeline
-
Streams são compostos por 3 elementos
- Uma fonte
- Zero ou mais operações(retornam novas streams)
- Uma operação terminal(produz um resultado ou um efeito colateral)
FONTE -> Operação Intermediária 1 -> ... -> Operação Intermediária n -> Operação Terminal -> Resultado
- Exemplo de utilização de Stream
List<Estudante> estudantes = new ArrayList<>();
double maiorNota = estudantes.stream() //.stream() é a fonte
.filter(e -> getAno() == 2015) //.filter() é uma operação intermediária
.mapToDouble(Estudante::getNota) //.mapToDouble() é uma operação intermediária
.max().getAsDouble(); //.max() é uma operação terminal
IMPORTANTE:
- O pipeline é processado somente quando a operação terminal é chamada
- Operações podem ser executadas sequencialmente ou de forma paralela
- Operações intermediárias podem ser combinadas
- Interface Collection: Métodos stream() e paralelStream
- Classe Arrays: Métodos stream()
- Classe Random,ThreadLocalRandom,SplittableRandom: Métodos int(), Métodos double(), Métodos long()(gerar Streams infinitos)
- Classe BufferedReader: Métodos line();
Tipo | Método | Descrição | Tipo de Operação |
---|---|---|---|
Filtragem | distinct() | Retorna um stream sem elementos duplicados | Intermediária |
Filtragem | range(valorInicial,valorFinal+1) | Retorna os valores existentes entre os dois parâmetros,sendo o valor final um acima do desejado | Intermediário |
Filtragem | filter(parâmetro) | Retorna um stream cujos elementos retornam true para o parâmetro definido | Intermediário |
Paginação | skip(valor) | Retorna um stream que "pula" os elementos do stream de entrada usando o numero entrado como parametro | Intermediário |
Paginação | limit(valor) | Retorna um stream que possui somente os elementos de entrada do stream de entrada sendo o tamanho definido como parâmetro | Intermediário |
Ordenação | sorted() | Retorna um stream ordenado de acordo com a ordenação natural(comparable) | Intermediário |
Ordenação | sorted(Comparator c) | Retorna um stream ordenado de acordo com a ordenação implementada no comparador c | Intermediário |
Busca e Seleção | findFirst(Predicate p) | Retorna o primeiro elemento que satisfaz o predicado p | Intermediário |
Busca e Seleção | findAny(Predicate p) | Retorna o primeiro elemento que satisfaz o predicado p mas de streams paralelos | Intermediário |
Busca e Seleção | allMatch(Predicate p) | Retorna true se todos os elementos satisfazem o predicado p | Intermediário |
Busca e Seleção | anyMatch(Predicate p) | Retorna true se qualquer elemento satisfaz o predicado p | Intermediário |
Busca e Seleção | noneMatch(Predicate p) | Retorna true se nenhum elemento satisfaz o predicado p | Intermediário |
Iteração | forEach(Consumer c) | Realiza uma ação sobre cada elemento do stream | Terminal |
Iteração | forEachOrdered(Consumer c) | Realiza uma ação sobre cada elemento do stream e garante que a ordem dos elementos é respeitada no caso de um stream paralelo | Intermediário |
Mapeamento | map(Function f) | Retorna um stream de objetos resultantes da função f aplicada a cada objeto do stream de entrada | Intermediário |
Mapeamento | mapToInt/mapToDouble/mapToLong | Versões de map() especializadas para gerar tipos especificos | Intermediário |
Mapeamento | flatMap(Function f) | Realiza "achatamento" de múltiplos streams gerados pela função f em um único | Intermediário |
Redução | reduce(BinaryOperator a) | Executa uma redução sobre um stream através da composição da função expressa pela função associativa representada pelo acumulador a e retorna um valor Optional | Terminal |
Redução | collect(Collector c) | Executa uma redução sobre um stream através da composição das funções expressas pelo coletor c e retorna o resultado | Terminal |
Redução | toArray()/toList()/toSet() | Retorna uma coleção específica contendo os elementos do stream | Terminal |
Contagem | count() | Retorna o número de elementos do stream | Terminal |
Contagem | max(),max(Comparator c) | Retorna o maior elemento do stream com um Optional | Terminal |
Contagem | min(),min(Comparator c) | Retorna o menor elemento do stream com um Optional | Terminal |
Contagem | average() | Retorna a média aritmética dos elementos do stream com um Optional | Terminal |
Contagem | sum() | Retorna a soma dos elementos do stream | Terminal |
- Optional Representa um objeto cujo valor pode ser null
- Proteção contra a necessidade de usar testes por null para evitar NullPointerException
- Métodos usados pelo Optional
- isPresent() = verifica se existe um objeto diferente de null
- get() = retorna o objeto, se ele não é null
- orElse() = retorna um outro objeto ao invés de null
- ifPresent() = executa um código se existe um objeto diferente de null
-
Mapeamento são operações intermediárias que projetam elementos de uma stream em outra forma através de uma função
-
Ex: Selecionar um valor de um objeto,calcular um valor sobre um objeto
-
Reduções são operações terminais que tomam uma sequẽncia de elementos de entrada e os combinam, através da aplicação sucessiva de uma operação, em um único resultado
-
Ex: calcular somatórios,gerar lista de elementos
- Por padrão, Os streams são de Object
- Para evitar de abrir e fechar várias vezes (boxing e unboxing) foram fornecidos implementações para streams sobre tipos primitivos
- Ex: IntStream,LongStream,DoubleStream
- O principal método são aqueles usados em map: .mapToDouble()