Java-stream (substituição de loop) [duplicado]

Dec 01 2020

Sou novo em Java e estou aprendendo / tentando entender o sistema com o Streams.

Em um exemplo, tenho o seguinte código:

private Comment findComment(String author)
{                 
   for(Comments comment : comments) {
        if(comment.getAuthor().equals(author)) {
            return comment;
        }
    }
    return null;
}

Para fins de treinamento, comecei a reescrever alguns métodos antigos (a maioria deles com for-loops) com streams para obter mais prática. Mas este pequeno método me manteve por mais de três nossos com javadocs (+ Google) e eu ainda não sei o que há de errado - ele nem mesmo compila: /

Aqui está o meu "novo" código que deve substituir o anterior:

private Comment findComment(String author)
{
    return comments.stream()
              .filter(s -> author.equals(s.getAuthor()))
              .findFirst();
}

Os comentários de ArrayList podem (no momento) armazenar apenas um comentário de um autor. Se um autor escrever um novo comentário, o antigo será excluído. Isso significaria que o .findFirst (); não é realmente necessário.

Em minha opinião, deveria ser possível restringir o ArrayList até que reste apenas um objeto e devolvê-lo à instrução return ... Estou certo ou esqueci algo?

Editar (01.12.2020, 10:13): Tive que editar o primeiro trecho de código. A declaração de retorno estava errada (erro de digitação ...)

Respostas

1 Mureinik Dec 01 2020 at 05:47

findFirstretorna um Optional. Para converter isso Optionalem um Commentobjeto e lidar com o caso em que nenhum Commenté encontrado enquanto você está nisso, você pode usar orElse:

private Comment findComment(String author)
{
    return comments.stream()
              .filter(s -> author.equals(s.getAuthor()))
              .findFirst()
              .orElse(null); // Here
}