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
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 ??
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.
Mas existem outras alternativas de fazer isso também, cada uma com seus prós e contras.