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

Dificuldade em aprimorar o código para Lambda

Boa noite.

Estava assistindo o video referente a Maps e também escrevendo o código junto com o professor Paulo. Tenho a mania de sempre implementar algo a mais, fazer algo diferente no código. Nesse caso eu estava tentando implementar a lambda conforme o código abaixo.

alunos.forEach(aluno ->  {
            if(Integer.valueOf(aluno.getNumeroMatricula()).equals(numero)) { 
                return aluno;                
            }
        });

Porem eu estou recebendo a seguinte exception ao tentar executar( o código na verdade nem esta compilando, eu executei para ver o erro que ia dar em tempo de execução).

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    The method forEach(Consumer<? super Aluno>) in the type Iterable<Aluno> is not applicable for the arguments ((<no type> aluno) -> {})
    Void methods cannot return a value

Detalhe, o erro ocorre após eu digitar "return aluno;" dentro do if, ai o código para de compilar. Se eu deixar apenas escrito "return;" o código compila.

Se fizer da forma como o professor codificou na aula, usando o enhanced for, também funciona.

public Aluno buscaMatriculado(int numero) {
        for (Aluno aluno : alunos) {
            if(Integer.valueOf(aluno.getNumeroMatricula()).equals(numero)) {
                return aluno;
            }
        }

Alguém pode me ajudar por favor?

Desde já grato

2 respostas
solução!

Boa noite Carlos beleza?

O método forEach deve retornar void por isso o compilador reclama, pois vc esta tentando retornar um aluno. O forEach é usado quando você quer executar uma ação que não retornará nada em cada elemento da lista.

Uma forma elegante de implementar o método buscaMatriculado seria usando o método filter:

    public static Aluno buscaMatriculado(int numero) {
        return alunos
            .stream()
            .filter(aluno -> Integer.valueOf(aluno.getNumeroMatricula()).equals(numero))
            .findFirst()
            .orElseThrow(() -> new RuntimeException("Aluno não encontrado"));
    }

stream() -> cria uma Stream

filter() -> retorna uma nova stream que contem apenas os elementos que atendam a condição especificada (no caso numeroMatricula == numero)

findFirst() -> vai retornar um Optional contendo o primeiro elemento da stream ou um optional vazio caso a stream esteja vazia

orElseThrow() -> Caso o optinal contenha um valor irá retorna-lo, senão irá lançar uma exception. Isso faz com que seu método nunca retorne nulo =D

Boa noite Mario. tudo bem sim, espero que com você também.

Nossa, e eu olhei na documentação e na exception, mas acho que estava tão cansado que acabou passando batido.

Vou implementar esse método que você me passou, parece muito elegante :)

Muito obrigado pela ajuda, mais um conhecimento importante aprendido.

Abraços