ก่อนอื่นให้ตรวจสอบการประกาศของทั้งสองวิธี
1) OrElse: เรียกใช้งานตรรกะและส่งผ่านผลลัพธ์เป็นอาร์กิวเมนต์
public T orElse(T other) {
return value != null ? value : other;
}
2) OrElseGet: เรียกใช้งานลอจิกหากค่าภายในตัวเลือกเป็นโมฆะ
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
คำอธิบายบางประการเกี่ยวกับการประกาศข้างต้น:
อาร์กิวเมนต์ของ“ Optional.orElse” มักจะถูกดำเนินการโดยไม่คำนึงถึงมูลค่าของวัตถุในตัวเลือก (null ว่างเปล่าหรือมีค่า) พิจารณาประเด็นที่กล่าวถึงข้างต้นเสมอในขณะที่ใช้“ ไม่ระบุหรือ orElse” มิฉะนั้นการใช้“ ไม่บังคับหรือไม่ก็ได้” อาจมีความเสี่ยงสูงในสถานการณ์ต่อไปนี้
ความเสี่ยง -1) ปัญหาการบันทึก:หากเนื้อหาภายในหรือปิดมีคำสั่งบันทึกใด ๆ : ในกรณีนี้คุณจะต้องทำการบันทึกทุกครั้ง
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
ความเสี่ยง -2) ปัญหาด้านประสิทธิภาพ:หากเนื้อหาภายในหรือหมดเวลา: เนื้อหาที่ใช้เวลามากอาจเป็นการเรียกใช้ฐานข้อมูล i / o ใด ๆ , การเรียก API, การเรียก API, การอ่านไฟล์ หากเราใส่เนื้อหาดังกล่าวใน orElse () ระบบจะจบการทำงานโดยไม่ต้องใช้รหัส
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
ความเสี่ยง -3) สถานะที่ผิดกฎหมายหรือปัญหาบั๊ก:หากเนื้อหาภายใน orElse เปลี่ยนแปลงสถานะของวัตถุบางอย่าง: เราอาจใช้วัตถุเดียวกันในที่อื่นให้พูดในฟังก์ชัน Optional.map และอาจทำให้เรามีข้อผิดพลาดร้ายแรง
List<Model> list = new ArrayList<>();
Optional.of(getModel())
.map(x -> {
})
.orElse(get(list));
get(List < String > list) {
log.error("No Data found, Returning default");
list.add(defaultValue);
return defaultValue;
}
จากนั้นเราจะไปกับ orElse () ได้เมื่อใด
ต้องการใช้ orElse เมื่อค่าเริ่มต้นคือวัตถุคงที่บางอย่าง enum ในกรณีข้างต้นทั้งหมดเราสามารถใช้ตัวเลือก Option.orElseGet () ซึ่งจะทำงานเมื่อตัวเลือกนั้นมีค่าที่ไม่ว่างเปล่า) แทนตัวเลือก Option.orElse () ทำไม?? ใน orElse เราส่งค่าผลลัพธ์เริ่มต้น แต่ใน orElseGet เราส่งผู้จำหน่ายและวิธีการของผู้ผลิตจะดำเนินการเฉพาะในกรณีที่ค่าในตัวเลือกเป็นโมฆะ
ประเด็นสำคัญจากสิ่งนี้:
- อย่าใช้“ ทางเลือก. orselse” หากมีคำสั่งบันทึกใด ๆ
- อย่าใช้“ เผื่อเลือกหรือไม่” หากมีตรรกะที่ใช้เวลามาก
- อย่าใช้“ ทางเลือกหรือไม่ก็ได้” หากมันทำการเปลี่ยนแปลงสถานะของวัตถุ
- ใช้“ ทางเลือก. หรือ” หากเราต้องส่งคืนค่าคงที่, enum
- ชอบ“ Optional.orElseGet” ในสถานการณ์ที่กล่าวถึงใน 1,2 และ 3 คะแนน
ฉันได้อธิบายสิ่งนี้ในจุดที่ 2 ( “ Optional.map/Optional.orElse”! =“ if / else” ) บล็อกขนาดกลางของฉัน ใช้ Java8 เป็นโปรแกรมเมอร์ไม่ใช่ coder
orElseGet
มันจะโทรหาซัพพลายเออร์เฉพาะในกรณีที่ไม่มีค่า