'Optional.get ()' โดยไม่ต้องทำเครื่องหมาย 'isPresent ()'


92

ฉันมีรหัสค้นหาต่อไปนี้ใน Java:

return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get();

ฉันต้องการค้นหาคอลัมน์ตามชื่อและส่งกลับรายการแรกที่พบ

ฉันเข้าใจว่ามีกรณีที่ไม่พบสิ่งใดและควรดำเนินการอย่างไร

นี่คือสิ่งที่ต้องการโดยคำสาบานนี้:

'Optional.get()' without 'isPresent()' check

เหรอ?

แก้ไขอย่างไร? ฉันต้องการที่จะกลับมาnullหากไม่พบสิ่งใด

อัปเดต

โอเคโอเคฉันไม่รู้ว่าfindFirst()จะกลับOptionalมา


2
โปรดทราบว่าคุณไม่ควรใช้$เป็นตัวระบุใน Java: JLS Sec 3.8 : "ควรใช้เครื่องหมาย $ ในซอร์สโค้ดที่สร้างขึ้นโดยกลไกเท่านั้นหรือแทบจะไม่ได้ใช้เพื่อเข้าถึงชื่อที่มีอยู่แล้วในระบบเดิม"
Andy Turner

คำตอบ:


187

แทนที่get()ด้วยorElse(null).


1
ทำไม? :) ทำไมorElseเริ่มต้นด้วย "หรือ"?
Dims

15
เพราะนั่นคือชื่อเมธอด และelseเป็นคำหลัก
Andy Turner

8
@Dims เป็นเพียงรูปแบบสั้น ๆ ของ getOrElse เพียงแค่ปล่อยให้ได้รับ ด้วยทางเลือกคุณควรใช้orElseแทนgetเพราะgetจะทำให้เกิดข้อยกเว้นหากค่าเป็นโมฆะ
puhlen

4
@puhlen orElseGet()ใช้เวลา a Supplier<T>ในขณะที่orElse()ใช้เวลาT. สิ่งเหล่านี้ไม่เทียบเท่า
bcsb1001

3
@ bcsb1001 นั่นไม่ใช่สิ่งที่เขาพยายามพูด "getOrElse" เป็นชื่อที่เขาคิดค้นขึ้นเพื่ออธิบายวัตถุประสงค์ของorElse; ไม่มีการอ้างอิงorElseGetในความคิดเห็นของเขา;)
Rorrim

23
...findFirst().orElse(null);

nullส่งกลับค่าถ้ามีผลตอบแทนอย่างอื่น เอกสารประกอบระบุว่าพารามิเตอร์ที่ผ่านอาจเป็นnull(สิ่งที่ห้ามใช้orElseGetและorElseThrow)


1
นั่นเป็นความจริงบางส่วน findFirst () มีกฎต่อไปนี้: "เมื่อไม่มีคำสั่งเผชิญหน้าจะส่งคืนองค์ประกอบใด ๆ จากสตรีม" -> ดังนั้นหากตัวกรองของคุณไม่ส่งคืนองค์ประกอบที่ตรงกัน findFirst () จะส่งคืนองค์ประกอบแรก (ยกเว้นสตรีมว่างเปล่าก่อน)
Fl0R1D3R


1

ทางเลือกถูกสร้างขึ้นเพื่อให้โค้ดสามารถทำได้หลังจากหลายทศวรรษที่ผ่านมาในที่สุดก็เริ่มหลีกเลี่ยงค่าว่าง

ลบ. get () ส่งคืนตัวเลือกและทำให้รหัสการโทรจัดการกับมันอย่างเหมาะสม (เช่นเดียวกับที่ต้องทำในกรณีที่คุณคืนค่า null)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.