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:
lista.stream(): Cria um stream a partir da lista de pessoas..filter(n -> n.getIdade() % 2 == 0): Filtra as pessoas, mantendo apenas aquelas com idade par..map(n -> n.getIdade()): Transforma cada pessoa filtrada em sua idade (um Integer)..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.