Reduzindo conjunto de dados com Stream.reduce() e Redescobrindo o tipo Map em Java

Поділитися
Вставка
  • Опубліковано 13 вер 2024
  • Este vídeo continua o curso de Programação Funcional apresentando o conceito de redução de dados no modelo de processamento Map/Reduce com o método Stream.reduce().
    Mostra que já usamos tal método por baixo dos panos em outras operações e um exemplo prático do uso de reduce().
    Apresenta uma infinidade de novos recursos de programação funcional com o tipo Map (convencionalmente HashMap) para nos permitir criar código mais expressivo, sucinto e menos suscetível a bugs.
    Por fim, mostra como coletar dados de uma lista em um formato de Map para estruturar os dados da forma que você precisa.
    #java #functionalprogramming #programacaofuncional #curso #map #reduce #stream

КОМЕНТАРІ • 3

  • @rauniii
    @rauniii 5 місяців тому

    Professor, minha a duvida é a seguinte: Por que o forEach do map não gera alterações ??
    (Ao replicar o video o intellij me sugere para essa versão de cod )
    mapPessComanda.forEach((key, value) -> {
    double v = value >= 10 ? value * 0.5 : value;
    System.out.println(key + " -- " + v);
    });
    System.out.println();
    mapPessComanda.forEach((chave, valor) -> System.out.println(chave + " -> " + valor));
    Pq no video o senhor usou o .entrySet().stream().forEach()
    Por isso fiquei em duvida eles funcionam da mesma form ??

    • @manoelcamposdev
      @manoelcamposdev  5 місяців тому +1

      Nenhum forEach de fato altera a estrutura que vc tá percorrendo (seja um List, Map, etc). O que fizemos foi apenas mostrar os dados alterados, sem alterar o mapa original. E sim, neste caso é bem mais simples fazer como você mostrou: usar o forEach diretamente no map. Só mostrei do outro jeito porque é uma possibilidade (mas era pra ter incluído um exemplo melhor).
      Imagina que vc não quer alterar o map original, e sim criar um novo map dando 10% de desconto pra todo mundo. Com o map.entrySet().stream() conseguimos fazer isso:
      // faz o import abaixo para o código ficar mais simples
      // import static java.util.AbstractMap.SimpleEntry;
      var novoMap = mapPessoaComanda
      .entrySet()
      .stream()
      .map(entry -> new SimpleEntry(entry.getKey(), entry.getValue() * 0.9))
      .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
      novoMap.forEach((nome, val) -> System.out.printf("%s: %f
      ", nome, val));
      Veja que o código é um pouco mais complicado.
      Estou percorrendo as entradas (entry) e criando uma nova, onde a chave é a mesma da entrada atual e o valor é o atual com 10% de desconto.
      Em seguida, eu coleto para um novo mapa, onde a chave e o valor são os mesmo da nova entrada que criei antes do collect.
      Esse é um exemplo que é mais complexo e é um dos casos onde usar um for tradicional vai ser mais simples. Por isso, que não temos como nos ver livres de programação estruturada.

    • @manoelcamposdev
      @manoelcamposdev  5 місяців тому +1

      Mas existem outras alternativas de fazer isso também, cada uma com seus prós e contras.