API_streams - F4NT0/J4V4 GitHub Wiki

Utilizando a API do java stream

  • Chamada da API: import java.util.stream

O que streams:

  • 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

Fontes de Streams

  • 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();

Operações sobre Stream

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

  • 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

Padrão Map-Reduce

  • 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

Streams de Primitivos

  • 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()
⚠️ **GitHub.com Fallback** ⚠️