Javaストリーム(置換forループ)[重複]

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)を使用して3つ以上の方法を実行し続けましたが、何が問題なのかはまだわかりません。コンパイルすらできません:/

上記を置き換える必要がある私の「新しい」コードは次のとおりです。

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

ArrayListコメントは、(その時点で)作成者からのコメントを1つだけ保存できます。作成者が新しいコメントを書き込むと、古いコメントは削除されます。つまり、.findFirst(); 本当に必要ではありません。

私の意見では、オブジェクトが1つだけ残るまでArrayListを絞り込んで、それをreturnステートメントに返すことができるはずです...私は正しいですか、それとも何かを忘れていますか?

編集(01.12.2020、10:13):最初のコードスニペットを編集する必要がありました。returnステートメントが間違っていました(タイプミス...)

回答

1 Mureinik Dec 01 2020 at 05:47

findFirstを返しますOptional。それOptionalCommentオブジェクトに変換し、そこにいる間に何Commentも見つからない場合を処理するには、次を使用できますorElse。

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