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.