Olá, Weid. Como vai?
Excelente resolução do desafio! Como desenvolvedor back-end, você já deve estar percebendo o quanto a Stream API do Java 8+ transforma a manipulação de coleções, deixando o código muito mais expressivo, declarativo e alinhado com o paradigma funcional.
A sua implementação passou com sucesso por cenários complexos, como o uso de filter, map, ordenação com sorted, agrupamento de listas com flatMap e limitação de resultados com limit.
Analisando o seu código de forma refinada, vale destacar um detalhe técnico no desafio dos números primos e propor uma otimização com boas práticas para os filtros dos produtos.
O Desafio dos Números Primos (map vs filter)
No trecho onde você busca os números primos dentro da listaAninhada, você utilizou a operação .map(...). O comportamento do map é transformar um dado em outro dado mantendo a mesma quantidade de elementos. No seu código, quando o número não é primo, você retorna false (um booleano), e quando é primo, você retorna o próprio número n (um inteiro).
Isso faz com que a lista final numerosPrimos se torne uma lista mista de tipos ou objetos, contendo valores como [false, 2, 3, false, 5, false, 7...].
Para obter uma lista contendo apenas os números primos, a boa prática é isolar a lógica de verificação em um método auxiliar que retorna um booleano e passá-lo dentro de um .filter(...). Veja como fica mais elegante:
// Método auxiliar para verificar se é primo
public static boolean ehPrimo(int n) {
if (n <= 1) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
// Execução na Stream
List<Integer> numerosPrimos = listaAninhada.stream()
.filter(Main::ehPrimo) // Filtra mantendo apenas os que retornam true
.toList();
Otimização no Filtro de Produtos
No bloco de produtos, o seu segundo filtro está verificando se o preço é menor ou igual a 100.000,00 (p.getPreco() <= 100000.00). Como todos os produtos da sua lista estão bem abaixo desse valor, o filtro acaba não surtindo um efeito prático de corte. Se o objetivo do desafio era filtrar produtos mais baratos (por exemplo, abaixo de 1.000,00), você pode ajustar o valor limite para tornar o limit(3) mais desafiador para o algoritmo.
Além disso, você pode encadear os filtros em uma única expressão lógica dentro do mesmo filter, o que reduz a criação de múltiplos estágios na pipeline da Stream:
List<Produto> produtosFiltrados = produtos.stream()
.filter(p -> p.getCategoria().equalsIgnoreCase("Eletrônicos") && p.getPreco() <= 1000.00)
.sorted(Comparator.comparing(Produto::getPreco))
.limit(3)
.toList();
Dominar essa combinação de predicados e funções de transformação é um diferencial enorme para construir APIs robustas e performáticas com o Spring Framework. Parabéns pelo nível das implementações!
Espero que possa ter lhe ajudado!