Java-поток (замена for-loop) [дубликат]

Dec 01 2020

Я новичок в Java и изучаю / пытаюсь понять систему с помощью Streams.

В примере у меня есть следующий код:

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

В целях обучения я начал переписывать некоторые старые методы (большинство из них с циклами for) с потоками, чтобы получить больше практики. Но этот небольшой метод поддерживал меня более трех часов с javadocs (+ Google), и я до сих пор не знаю, что не так - он даже не компилируется: /

Вот мой «новый» код, который должен заменить приведенный выше:

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

Комментарии ArrayList могут (на данный момент) хранить только один комментарий от автора. Если автор пишет новый комментарий, старый удаляется. Это будет означать, что .findFirst (); на самом деле не нужно.

На мой взгляд, можно сузить список ArrayList до тех пор, пока не останется только один объект, и вернуть его обратно в оператор return ... Я прав или что-то забыл?

Изменить (01.12.2020, 10:13): мне пришлось отредактировать первый фрагмент кода. Оператор возврата был неправильным (опечатка ...)

Ответы

1 Mureinik Dec 01 2020 at 05:47

findFirstвозвращает Optional. Чтобы преобразовать это Optionalв Commentобъект и обработать случай, когда нет, Commentпока вы на нем, вы можете использовать orElse:

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