1
resposta

[Bug] Alternativas incorretas no desafio

Olá, percebi um erro em um exercício proposto na plataforma pois não segue os algoritmos da questão:

Utilizando o Stream API e o conceito de Maps, peek, findFirst e demais recursos', como você criaria um fluxo que filtra as transações com valores superiores a 5000, imprime uma espécie de log com peek, busca a primeira destas transações encontradas e coleta os resultados em um Set?

Teoricamente, o código seria algo como:

transacoes.stream()
 .filter(t -> t.getValor() > 5000)
 .peek(System.out::println)
 .findFirst()
 .collect(Collectors.toSet()).stream();

Contudo, das alternativas apresentadas, a que apresentou como correta foi a letra A:

transacoes.stream()
 .filter(t -> t.getValor() > 5000)
 .peek(System.out::println)
 .collect(Collectors.toSet()).stream()
 .findFirst();

Neste segundo caso, o 'findFirst()' está vindo posterior ao 'collect', onde no enunciado pede para que o algoritmo seja o contrário:
"busca a primeira destas transações encontradas e coleta os resultados em um Set?".

Poderiam verificar por gentileza?

1 resposta

Olá Eduardo.
Analise interessante.
Vamos conferir:
Tanto o codigo que voce deu de exemplo tanto quanto a alternativa da plataforma estão erradas.
O que está errado com seu exemplo?

  • Uso de findFirst():
    O método findFirst() retorna um Optional<Transacao>, que é um contêiner que pode ou não conter uma transação.
    Portanto, você não pode aplicar diretamente collect(Collectors.toSet()) após findFirst() porque o Optional não é um Stream, é um tipo especial que pode ou não ter um valor.
  • Uso de collect(Collectors.toSet()) após findFirst():
    Como o findFirst() retorna um Optional, tentar usar collect() após ele não faz sentido.
    Isso resultaria em erro de compilação, pois Optional não pode ser coletado diretamente em um Set.
  • Uso do stream() após collect():
    Depois de chamar collect(Collectors.toSet()), você obteria um Set<Transacao>.
    Você não precisaria chamar .stream() sobre esse Set novamente para buscar um valor.
    Além disso, como a questão pede para buscar a primeira transação e coletá-las em um Set, a ordem correta seria buscar a primeira transação antes de coletá-las.
    O que está errado com a alternativa da Alura?
    Essa alternativa está errada, pois a ordem está invertida de acordo com o que foi solicitado na questão.
    collect() deve vir antes de findFirst(), porque a ideia é coletar todas as transações que atendem ao critério e, em seguida, buscar a primeira (se for o caso) no Set.
    O que seria correto?
    A alternativa correta seria algo mais próximo de:
transacoes.stream()
    .filter(t -> t.getValor() > 5000)
    .peek(System.out::println)
    .findFirst()                       // Busca a primeira transação
    .map(Collections::singleton)       // Envolvem a primeira transação encontrada em um Set (opcional)
    .orElseGet(HashSet::new);          // Caso não encontre nenhuma, retorna um Set vazio

Esse código garante que a busca pela primeira transação ocorre antes da coleta, e o resultado será um Set com a transação encontrada (ou vazio se não houver nenhuma).
Analisa ai com calma e me envia um feedback.
Bons estudos.