3
respostas

Dúvidas Filter

List<Pessoa> lista = new ArrayList<>();
        lista.add(new Pessoa("Maria de Jesus", 32, 1500));
        lista.add(new Pessoa("Pedro de Alencar Ferreira", 15, 2700));
        lista.add(new Pessoa("Paulo Neto", 20, 900));
        lista.add(new Pessoa("Jose", 44, 3200));
        
        Set<Integer> pares = lista.stream()
                .filter(n -> n.getIdade() % 2 == 0)
                .collect(Collectors.toSet());

        System.out.println(pares); // Output: [2, 4, 6, 8, 10]		
        

Porque esse código está errado?

Fiz assim depois de postar e deu certo.

List<Integer> saida = lista.stream().filter(n-> n.getIdade() % 2 == 0).map(n->n.getIdade());

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

3 respostas

Olá, João! Tudo bem?

Vamos entender por que o primeiro código não funcionou e por que o segundo funcionou corretamente.

Analisando o primeiro código:

List<Pessoa> lista = new ArrayList<>();
lista.add(new Pessoa("Maria de Jesus", 32, 1500));
lista.add(new Pessoa("Pedro de Alencar Ferreira", 15, 2700));
lista.add(new Pessoa("Paulo Neto", 20, 900));
lista.add(new Pessoa("Jose", 44, 3200));

Set<Integer> pares = lista.stream()
        .filter(n -> n.getIdade() % 2 == 0)
        .collect(Collectors.toSet());

System.out.println(pares);

O problema:

O erro nesse código está na forma como você está tentando coletar os resultados do stream. Você está usando Collectors.toSet(), que coleta os elementos do stream em um Set<Pessoa>. No entanto, você está filtrando as pessoas com base na idade, mas não está transformando os objetos Pessoa em Integer (idades) antes de coletar. Isso significa que o Set<Integer> não pode armazenar objetos do tipo Pessoa.

Por que o segundo código funcionou:

List<Integer> saida = lista.stream()
        .filter(n -> n.getIdade() % 2 == 0)
        .map(n -> n.getIdade())
        .collect(Collectors.toList());

A solução:

Neste código, você adicionou um passo importante: o map. O map transforma cada objeto Pessoa em um Integer (a idade da pessoa) antes de coletar os resultados. Agora, o Collectors.toList() pode coletar os Integer em uma List<Integer>.

Explicando passo a passo:

  1. lista.stream(): Cria um stream a partir da lista de pessoas.
  2. .filter(n -> n.getIdade() % 2 == 0): Filtra as pessoas, mantendo apenas aquelas com idade par.
  3. .map(n -> n.getIdade()): Transforma cada pessoa filtrada em sua idade (um Integer).
  4. .collect(Collectors.toList()): Coleta as idades em uma lista de inteiros.
  • O primeiro código estava errado porque você estava tentando coletar objetos Pessoa em um Set<Integer>.

  • O segundo código funcionou porque você usou o map para transformar os objetos Pessoa em Integer antes de coletar os resultados.

Espero ter ajudado.

Muito obrigado, ficou muito bem explicado. Excelente feedback

Fico feliz em ter ajudado! Bons estudos e continue mandando bem.