Java-stream (แทนที่สำหรับลูป) [ซ้ำ]

Dec 01 2020

ฉันเพิ่งเริ่มใช้ Java และกำลังเรียนรู้ / พยายามทำความเข้าใจระบบด้วย Streams

ในตัวอย่างฉันมีรหัสต่อไปนี้:

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

เพื่อจุดประสงค์ในการฝึกอบรมฉันเริ่มเขียนวิธีการเก่า ๆ (ส่วนใหญ่มี for-loops) กับสตรีมเพื่อฝึกฝนเพิ่มเติม แต่วิธีการเล็ก ๆ น้อย ๆ นี้ทำให้ฉันใช้ javadocs (+ Google) มากกว่าสามครั้งและฉันก็ยังไม่รู้ว่ามีอะไรผิดพลาด - มันจะไม่รวบรวม: /

นี่คือรหัส "ใหม่" ของฉันซึ่งควรแทนที่ด้านบน:

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

ความคิดเห็น ArrayList สามารถจัดเก็บความคิดเห็นจากผู้เขียนได้เพียงรายการเดียว หากผู้เขียนเขียนความคิดเห็นใหม่ความคิดเห็นเก่าจะถูกลบ นั่นหมายความว่า .findFirst (); ไม่จำเป็นจริงๆ

ในความคิดของฉันควร จำกัด ArrayList ให้แคบลงจนกว่าจะเหลือวัตถุเพียงชิ้นเดียวและส่งกลับไปที่คำสั่งส่งคืน ... ฉันพูดถูกหรือฉันลืมอะไรไป?

แก้ไข (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
}