Giter VIP home page Giter VIP logo

digitalinnovationone / ganhando_produtividade_com_stream_api_java Goto Github PK

View Code? Open in Web Editor NEW
691.0 3.0 427.0 47 KB

Este repositório contém o código-fonte do curso "Ganhando Produtividade com Stream API Java". O curso foi projetado para ajudar desenvolvedores Java a aproveitar ao máximo a poderosa Stream API introduzida no Java 8.

Home Page: https://web.dio.me/course/ganhando-produtividade-com-stream-api

Java 100.00%
java17 java8 programacao-funcional

ganhando_produtividade_com_stream_api_java's Introduction

Ganhando Produtividade com Stream API e Java

  • A Streams API traz uma nova opção para a manipulação de coleções em Java seguindo os princípios da programação funcional.
  • Stream, trata-se de uma poderosa solução para processar coleções de maneira declarativa, ao invés da tradicional e burocrática forma imperativa.
public class CarrinhoDeCompras {
  //atributos
  private List<Item> itemList;
  //construtor
  public CarrinhoDeCompras() {
    this.itemList = new ArrayList<>();
  }
  
  //método para calcular valor total dos itens sem utilizar o Stream API
  public double calcularValorTotal() {
    double valorTotal = 0d;
    if (!itemList.isEmpty()) {
      for (Item item : itemList) {
        double valorItem = item.getPreco() * item.getQuant();
        valorTotal += valorItem;
      }
      return valorTotal;
    } else {
      throw new RuntimeException("A lista está vazia!");
    }
  }
}
  • Na forma imperativa, para realizar uma soma simples, por exemplo, o desenvolvedor tem que se preocupar não apenas com o que deve ser feito em cada elemento, isto é, com as regras associadas ao processamento dos elementos da lista, mas também com a maneira de realizar essa iteração.
public class CarrinhoDeCompras {
  //atributos
  private List<Item> itemList;
  //construtor
  public CarrinhoDeCompras() {
    this.itemList = new ArrayList<>();
  }
  
  //método para calcular valor total dos itens utilizando o Stream API
  public double calcularValorTotal() {
    if (itemList.isEmpty()) {
      throw new RuntimeException("A lista está vazia!");
    }
    return itemList.stream()
        .mapToDouble(item -> item.getPreco() * item.getQuant())
        .sum();
  }
}
  • Combinada com as Expressões Lambda e Method reference, eles proporcionam uma forma diferente de lidar com conjuntos de elementos, oferecendo ao desenvolvedor uma maneira simples e concisa de escrever código que resulta em facilidade de manutenção e paralelização sem efeitos indesejados em tempo de execução.
  • As operações na Stream API podem ser classificadas em duas categorias principais:
  1. Operações Intermediárias: são aquelas que retornam uma nova Stream e permitem encadear várias operações, formando um pipeline de processamento de dados. São elas:
  • filter(Predicate<T> predicate): Filtra os elementos da Stream com base em um predicado. Retorna uma nova Stream contendo apenas os elementos que atendem ao critério do predicado. Exemplo: stream.filter(n -> n > 5)
  • map(Function<T, R> mapper): Transforma cada elemento da Stream usando a função especificada e retorna uma nova Stream contendo os elementos resultantes. Exemplo: stream.map(s -> s.toUpperCase())
  • sorted(): Classifica os elementos da Stream em ordem natural (se os elementos forem comparáveis) ou de acordo com um comparador fornecido. Exemplo: stream.sorted()
  • distinct(): Remove elementos duplicados da Stream, considerando a implementação do método equals() para comparação. Exemplo: stream.distinct()
  • limit(long maxSize): Limita o número de elementos da Stream aos maxSize primeiros elementos Exemplo: stream.limit(10)
  • skip(long n): Pula os primeiros n elementos da Stream e retorna uma nova Stream sem eles. Exemplo: stream.skip(5)
  1. Operações Terminais: são aquelas que encerram o pipeline e produzem um resultado final. São elas:
  • forEach(Consumer<T> action): Executa uma ação para cada elemento da Stream. Exemplo: stream.forEach(System.out::println)
  • toArray(): Converte a Stream em um array contendo os elementos da Stream. Exemplo: stream.toArray()
  • collect(Collector<T, A, R> collector): Coleta os elementos da Stream em uma estrutura de dados específica, como uma lista ou um mapa. Exemplo: stream.collect(Collectors.toList())
  • count(): Retorna o número de elementos na Stream. Exemplo: stream.count()
  • anyMatch(Predicate<T> predicate): Verifica se algum elemento da Stream atende ao predicado especificado. Exemplo: stream.anyMatch(s -> s.startsWith("A"))
  • allMatch(Predicate<T> predicate): Verifica se todos os elementos da Stream atendem ao predicado especificado. Exemplo: stream.allMatch(n -> n > 0)
  • noneMatch(Predicate<T> predicate): Verifica se nenhum elemento da Stream atende ao predicado especificado. Exemplo: stream.noneMatch(s -> s.isEmpty())
  • min(Comparator<T> comparator) e max(Comparator<T> comparator): Encontra o elemento mínimo e máximo da Stream, respectivamente, de acordo com o comparador fornecido. Exemplo: stream.min(Comparator.naturalOrder()) ou stream.max(Comparator.naturalOrder())
  • reduce(T identity, BinaryOperator<T> accumulator): Combina os elementos da Stream usando o acumulador especificado e retorna o resultado final. Exemplo: stream.reduce(0, (a, b) -> a + b)

Lambda

  • As expressões lambda permitem representar interfaces funcionais (interfaces com um único método abstrato) de forma mais concisa e possibilitam escrever código no estilo funcional.
  • As interfaces funcionais desempenham um papel crucial na programação funcional em Java, pois servem de base para o uso de expressões lambda.
  • Uma função lambda é uma função sem declaração, isto é, não é necessário colocar um nome, um tipo de retorno e o modificador de acesso. A ideia é que o método seja declarado no mesmo lugar em que será usado.
  • As funções lambda em Java tem a sintaxe definida como (argumento) -> (corpo).
public class OrdenacaoPessoa {
  //atributo
  private List<Pessoa> pessoaList;

  //construtor
  public OrdenacaoPessoa() {
    this.pessoaList = new ArrayList<>();
  }

  public List<Pessoa> ordenarPorAltura() {
    if (!pessoaList.isEmpty()) {
      List<Pessoa> pessoasPorAltura = new ArrayList<>(pessoaList);
      pessoasPorAltura.sort((p1, p2) -> Double.compare(p1.getAltura(), p2.getAltura()));
      return pessoasPorAltura;
    } else {
      throw new RuntimeException("A lista está vazia!");
    }
  }
}

Method Reference

  • Method Reference é um novo recurso do Java 8 que permite fazer referência a um método ou construtor de uma classe (de forma funcional) e assim indicar que ele deve ser utilizado num ponto específico do código, deixando-o mais simples e legível.
  • Para utilizá-lo, basta informar uma classe ou referência seguida do símbolo “::” e o nome do método sem os parênteses no final.
public class OrdenacaoPessoa {
  //atributo
  private List<Pessoa> pessoaList;

  //construtor
  public OrdenacaoPessoa() {
    this.pessoaList = new ArrayList<>();
  }

  public List<Pessoa> ordenarPorAltura() {
    if (!pessoaList.isEmpty()) {
      List<Pessoa> pessoasPorAltura = new ArrayList<>(pessoaList);
      pessoasPorAltura.sort(Comparator.comparingDouble(Pessoa::getAltura));
      return pessoasPorAltura;
    } else {
      throw new RuntimeException("A lista está vazia!");
    }
  }
}

Referências

[1] "Java Stream API - Oracle." Oracle Brasil. Disponível em: https://www.oracle.com/br/technical-resources/articles/java-stream-api.html.

[2] "Java Collections API Examples - cami-la." GitHub. Disponível em: https://github.com/cami-la/collections-java-api-2023.

[3] "Como usar funções functional_interface em Java - DevMedia." DevMedia. Disponível em: https://www.devmedia.com.br/como-usar-funcoes-lambda-em-java/32826.

ganhando_produtividade_com_stream_api_java's People

Contributors

cami-la avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

ganhando_produtividade_com_stream_api_java's Issues

Dúvida desafio 7

Oi Camila!
No desafio 7 realizei esta implementação:

package stream_api;

import java.util.Arrays;
import java.util.List;

public class Desafio7 {
    public static void main(String[] args) {
        List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);
        System.out.println(numeros.stream().sorted().toList().get(numeros.size()-2));
    }
}

porém fiquei com dúvida se seria uma boa forma de obter o elemento pedido usando get(numeros.size()-2)).

Dúvida desafio 3

Oi, Cami, tudo bem?

Estou resolvendo os desafios e fiquei na dúvida em como eu posso resolver o desafio 3.
"Desafio 3 - Verifique se todos os números da lista são positivos:"

Eu queria fazer um comparador, item por item da lista, e vir retornando "Verdadeiro" ou "Falso", mas estou com dificuldades.

Como eu posso fazer para ele fazer o teste lógico e vir retornando o resultado booleano, item por item?

Poderia me ajudar?

Duvida Desafio 5

List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);
        OptionalDouble media = numeros.stream().filter(n -> n > 5).mapToDouble(Integer::doubleValue).average();
        System.out.printf("A média para os maiores de 5 é : " + media);

Eu cheguei a essa conclusão, porém na impressão sai, OptionalDouble[8.0]

eu gostaria que imprimisse no console somente o resultado da média, 8.0 sem o OptionalDouble.
Captura de tela 2023-08-28 203101

DUVIDA - ERRO NO IMPORT STREAM

Olá,
Estou fazendo a aulas sobre Stream API, e quando faço o import do Stream, ele apresenta um erro como se eu não tivesse usando o import, e no Stream fica aparecendo o erro embaixo como eu não tivesse importado, eu já exclui a classe e refiz, exclui o projeto e refiz, eu atualizei o Java JDK, mas não consegui achar a causa, poderia me ajudar ?

Obs: No "Consumer" eu não utilizei o Stream apenas o forEach e consegui resolver da mesma maneira, mas o Stream sempre apresenta esse erro.

duvida import

um breve e concisa explicação sobre o código abaixo

Stream API Java - Principais Métodos

Vamos praticar e aprofundar nossos conhecimentos na poderosa Stream API do Java!
Abaixo, apresentamos uma lista de desafios envolvendo operações com streams para exercitar suas habilidades e criatividade.

Para todos os desafios, utilizem a lista de números inteiros fornecida:

List numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);

Desafio 1 - Mostre a lista na ordem numérica:

Crie um programa que utilize a Stream API para ordenar a lista de números em ordem crescente e a exiba no console.

Código

import java.util.Arrays;
import java.util.List;

public class Desafio1 {
    public static void main(String[] args) {
        //criar lista números inteiros
        List numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);
        //usar o sorted para ordenação dos números
        //Teste de impressão , não precisa explicar
        //numeros.stream().forEach(System.out::println);
        //Teste do sorted() com impressão
        //numeros.stream().sorted().forEach(System.out::println);
        //Copiei da internet queria entender os parâmetros dentro do sorted onde posso pesquisar o assunto, obrigado pela atenção.
        numeros.stream().sorted(Integer::compareTo).forEach(System.out::println);
    }
}

Duvida Desafio 10

Olá, Cami. Tudo bem?

Consegui resolver o desafio 10 porém gostaria de saber se há uma forma melhor para simplificar o código, sinto que repeti na verificação dos multiplos mas nao consegui pensar em outra forma de resolver. Pode me ajudar?

image

DUVIDA - STREAM-API

Olá, estou tentando remover elementos utilizando o removeIf, mas a IDE me passa uma exception = UnsupportedOperationException : remove
List numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);

         numeros.removeIf(n -> n % 2 != 0);
         System.out.println(numeros);

Obs: Tentei de diversas maneiras, mesmo colocando como exceção checada e não checada, simplesmente ele não aceita, o que faço?

att Rafael

Duvida Binary Operator

Tentei reproduzir o binary Operator na minha IDE e simplesmente da um warning sem proposta de solução. Eu posso até copiar do exemplor do GIT aqui que continua dando erro.

Duvida desafio 7

Boa tarde, prô!

Estou com dúvida no exercicio 7, como localizar o segundo maior valor da lista usando stream, qual seria a maneira correta usando stream? pensei em organizar do menor para o maior, contar a quantidade de elementos da stream e usar o skip para pular ate o penultimo, mas nao parece ser a maneira correta...

Desafio 14

Ola @cami-la , tudo bem?

travei no desafio 14, encontrei um aluno que fez um codigo genial:


 Optional<Integer> maiorPrimo = numeros.stream()
                .filter(n -> {
                    if (Math.abs(n) < 2)
                        return false;
                    for (int i = 2; i < Math.abs(n); i++) {
                        if (Math.abs(n) % i == 0)
                            return false;
                    }
                    return true;
                })
                .max(Comparator.naturalOrder());
        System.out.println("O maior número primo é: " + maiorPrimo.get());
    }

testei e funcionou, porem nao entendi, porque ele utilizou o Math.abs, pesquisei sobre essa função, e ela serve para retornar o valor absoluto, como utilizamos divisao com mod zero, seria mesmo necessario? não entend o fato delle utilizar tambem : .filter(n -> { if (Math.abs(n) < 2) return false; , qual seria o sentido de comprar se o valor absoluto de "n" por exemplo da lista, se o valor absoluto de 2 é menor que 2? e caso seja, retorne false e por ai segue o codigo dele, poderia me explicar o codigo dele, assim posso tentar entender a logica dele

Duvida no desafio 5

Desafio 05

Não sei como tirar a média com Stream API, a única coisa que consigo fazer é somar todos os valores.
Acredito que exista uma forma de fazer isso diretamente pelo Stream API, só não sei como :/

	List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);
	
	int media = numeros.stream()
			.reduce(0 , (n1, n2) -> n1 + n2);
	
	System.out.println(media);

Desafio 2

Boa noite Camila, tudo bem? Estou com dificuldade para resolver o exercício nº 2 (Soma dos pares)

List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);
		Function<Integer, Integer> somaPar = n -> n+=(n % 2);
		List<Integer> somaNumerosPares = numeros.stream().map(somaPar).toList();
		somaNumerosPares.forEach(System.out::print);

Gostaria de um auxílio se fosse possível, obrigado.

Desafio 18

Oi, Cami, tudo bem?

No desafio 18 - "Verifique se todos os números da lista são iguais"

Eu gostaria de resolver esse desafio retornando uma lista apenas com os números que se repetem, porém, estou com dificuldades de chegar a essa resolução.
Poderia me ajudar?

Dúvida no Reduce

Olá Cami.

Sobre o desafio 12, eu fiz a resolução da seguinte forma:
int produto = numeros.stream().reduce(0, (num1, num2) -> num1 * num2);

Porém, estava dando sempre 0. Então para fins de estudo, joguei no Bard e ele me retornou a seguinte resolução:
int produto = numeros.stream().reduce(1, (num1, num2) -> num1 * num2);

Então acho que não entendi muito para que serve esse número antes da operação, dentro do reduce: antes eu
havia colocado 0, depois tive de colocar 1.
Pelo que você explicou ele é um acumulador certo? Para soma ele funciona normal.
Seria mais ou menos algo como: Acumular utilizando aquele número, já que multiplicação por 0 sempre dará 0.
Se poder me explicar melhor, meio que entendi a lógica mas não entendi como funciona exatamente.

Desafio 8

Oi @cami-la , tudo bem?

Eu realizei a implementação do desafio 8, mais parece estar complexo, ainda não consegui pensar em uma forma de melhorar. Sabe me dizer outra forma de resolver?

Minha implementação:

Desafio 8 - Somar os dígitos de todos os números da lista:
Utilizando a Stream API, realize a soma dos dígitos de todos os números da lista e exiba o resultado no console.

List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3, 11, 28, 35, 180, 110, 200, 245);

    int resultado = numeros.stream().mapToInt(n -> {
        if (n / 10 == 0) return n;
        int sum = 0;
        int length = String.valueOf(n).length();
        for (int i = 0; i < length; i++) {
            sum += n % 10;
            n = n / 10;
        }
        return sum;
    }).sum();

    System.out.println("A soma dos dígitos de todos os números da lista é: " + resultado);`

Dúvida desafio 4

Oi, Camila!

No desafio 4, consegui selecionar os números ímpares, porém quando fui removê-los da lista, não deu certo (tentei remover utilizando o método removeAll). Qual o procedimento para a remoção?

Obrigado!

Segue meu código:

public class RemoverImpares {

public static void main(String[] args) {

    List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);

    List<Integer> numerosImpares = numeros.stream().filter(n -> n % 2 != 0).toList();

}

}

Desafio 14 e 17

Oi Cami, tudo bem?
Estou com dificuldade no desafio 14 e 17 por conta dos números primos.
Poderia me ajudar com o código por favor?
tentei o 14 assim:
public class Desafio14 {
public static void main(String[] args) {
List numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);

    //Encontre o maior número primo da lista:
    int maiorPrimo = numeros.stream()
        .filter(n -> (n % n == 0 && n % 1 == 0));
        .mapToInt(Integer::intValue)
        .max()
    System.out.println(maiorPrimo);
}

}
mas não faz sentido, então não consegui fazer o 17 por ser parecido também

Duvida desafio 16

Boa tarde,

Já realizei os demais desafios porém ainda não sei como resolver o desafio 16. Não sei se preciso criar uma List para acomodar o inteiro passado pelo usuário ou se existe alguma forma direta.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.