Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Exercício: Trabalhando com lambdas e Stream, volume 4, armazenando dados em um set.

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?

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

Olá pessoal, minha duvida é quando vc faz um collect em um set que vc finaliza um stream e depois iniciar uma outra stream em cima do resultado do collect para poder pergar o primeiro resultado com findFirst ? Não não conseguir entender esse fluxo, e do porque fazer isso ?

Optional<Transacao> resultado = transacoes.stream()
    .filter(t -> t.getValor() > 5000)
    .findFirst();
    resultado.ifPresentOrElse(
                r -> System.out.println("O primeiro valor e: " + r),
                        () -> System.out.println("Nenhum Valor encontrado!")

Assim eu tenho o mesmo resultado sem complicar. Claro que não vai ser um set, mas se for pra mostrar o primeiro resultado da operação fazendo todo tratamento pra saber se existe.

2 respostas
solução!

daria pra fazer

transacoes.stream()
    .filter(t -> t.getValor() > 5000)
    .findFirst()
    .ifPresentOrElse(
        r -> System.out.println("O primeiro valor é: " + r),
        () -> System.out.println("Nenhum valor encontrado!")
    );

mas neste caso o vaçor não seria atribuido a variavel. A forma como está é para a variavel "resultado" ter o valor , ai você pode usar posteriormente para o que quier... outra opção seria

public void processarTransacao(Transacao transacao) {
    // Lógica qualquer: exibir, salvar no banco, enviar para outro serviço, etc.
    System.out.println("Processando transação: " + transacao);
}

transacoes.stream()
    .filter(t -> t.getValor() > 5000)
    .findFirst()
    .ifPresentOrElse(
        this::processarTransacao, // callback se valor existir
        () -> System.out.println("Nenhuma transação com valor acima de 5000 encontrada.") // fallback
    );

mas a leitura é um pouco mais dificil, e da-se para entender porque o instrutor escolheu a outra abordagem. De toda forma, o resultado não é um set nem uma lista por causa do "findFirst()", que tentara pegar o primeiro item da coleção

Vlw pela respota... realmente demorei um tiquim pra entender o fluxo... mas já é outra opção !!!!