Java-stream (pengganti loop) [duplikat]

Dec 01 2020

Saya baru mengenal Java dan mempelajari / mencoba memahami sistem dengan Streams.

Dalam contoh saya memiliki kode berikut:

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

Untuk tujuan pelatihan, saya mulai menulis ulang beberapa metode lama (kebanyakan dengan for-loop) dengan aliran untuk mendapatkan lebih banyak latihan. Tetapi metode kecil ini membuat saya terus berjalan selama lebih dari tiga metode kami dengan javadocs (+ Google) dan saya masih tidak tahu apa yang salah - bahkan tidak dapat dikompilasi: /

Berikut kode "baru" saya yang seharusnya menggantikan yang di atas:

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

Komentar ArrayList hanya dapat (pada saat itu) menyimpan satu komentar dari seorang penulis. Jika seorang penulis menulis komentar baru, komentar lama akan dihapus. Itu berarti bahwa .findFirst (); tidak terlalu penting.

Menurut pendapat saya, mungkin saja untuk mempersempit ArrayList hingga hanya ada satu objek yang tersisa dan mengembalikannya ke pernyataan return ... Apakah saya benar atau apakah saya lupa sesuatu?

Edit (01.12.2020, 10:13): Saya harus mengedit cuplikan kode pertama. Pernyataan kembali salah (salah ketik ...)

Jawaban

1 Mureinik Dec 01 2020 at 05:47

findFirstmengembalikan sebuah Optional. Untuk mengubahnya Optionalmenjadi Commentobjek, dan menangani kasus di mana tidak ada Commentyang ditemukan saat Anda melakukannya, Anda dapat menggunakan orElse:

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