Strumień Java (zamiennik pętli for) [duplikat]

Dec 01 2020

Jestem nowy w Javie i uczę się / próbuję zrozumieć system za pomocą strumieni.

W przykładzie mam następujący kod:

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

W celach szkoleniowych zacząłem przepisywać niektóre stare metody (większość z nich z pętlami for) ze strumieniami, aby uzyskać więcej praktyki. Ale ta mała metoda pozwoliła mi pracować przez ponad trzy nasze z javadocs (+ Google) i nadal nie wiem, co jest nie tak - nawet się nie skompiluje: /

Tutaj mój „nowy” kod, który powinien zastąpić powyższy:

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

Komentarze ArrayList mogą (w danym momencie) przechowywać tylko jeden komentarz autora. Jeśli autor napisze nowy komentarz, stary zostanie usunięty. Oznaczałoby to, że .findFirst (); nie jest naprawdę konieczne.

Moim zdaniem powinno być możliwe zawężenie ArrayList do momentu, gdy zostanie tylko jeden obiekt i oddanie go z powrotem do instrukcji return… Mam rację, czy o czymś zapomniałem?

Edycja (01.12.2020, 10:13): Musiałem edytować pierwszy fragment kodu. Instrukcja return była nieprawidłowa (literówka ...)

Odpowiedzi

1 Mureinik Dec 01 2020 at 05:47

findFirstzwraca plik Optional. Aby przekonwertować to Optionalna Commentobiekt i obsłużyć przypadek, w którym nie Commentzostanie znalezione, możesz użyć orElse:

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