Trước hết kiểm tra khai báo của cả hai phương pháp.
1) OrElse: Thực thi logic và truyền kết quả làm đối số.
public T orElse(T other) {
return value != null ? value : other;
}
2) OrElseGet: Thực thi logic nếu giá trị bên trong tùy chọn là null
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
Một số giải thích về khai báo trên:
Đối số của Tùy chọn.orElse, luôn luôn được thực thi bất kể giá trị của đối tượng trong tùy chọn (null, rỗng hoặc có giá trị). Luôn luôn xem xét các điểm đã đề cập ở trên trong khi sử dụng tùy chọn của Cameron.orElse, nếu không thì sử dụng tùy chọn của Cameron tùy chọn.orElse có thể rất rủi ro trong tình huống sau.
Rủi ro-1) Vấn đề ghi nhật ký: Nếu nội dung bên trong orElse chứa bất kỳ tuyên bố nhật ký nào: Trong trường hợp này, bạn sẽ kết thúc việc đăng nhập mỗi lần.
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
Rủi ro-2) Vấn đề về hiệu suất: Nếu nội dung bên trong orElse tốn nhiều thời gian: Nội dung đòi hỏi nhiều thời gian có thể là bất kỳ hoạt động i / o cuộc gọi DB, cuộc gọi API, đọc tệp. Nếu chúng tôi đưa nội dung đó vào orElse (), hệ thống sẽ kết thúc thực thi một mã không sử dụng.
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
Rủi ro-3) Trạng thái bất hợp pháp hoặc Sự cố lỗi: Nếu nội dung bên trong orElse đang làm biến đổi một số trạng thái đối tượng: Chúng ta có thể đang sử dụng cùng một đối tượng ở một nơi khác, giả sử bên trong hàm Options.map và nó có thể khiến chúng ta gặp phải một lỗi nghiêm trọng.
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;
}
Sau đó, khi nào chúng ta có thể đi với orElse ()?
Thích sử dụng orElse khi giá trị mặc định là một số đối tượng không đổi, enum. Trong tất cả các trường hợp trên, chúng ta có thể đi với Options.orElseGet () (chỉ thực thi khi Tùy chọn chứa giá trị không trống) thay vì Tùy chọn.orElse (). Tại sao?? Trong orElse, chúng tôi chuyển giá trị kết quả mặc định, nhưng trong orElseGet, chúng tôi vượt qua Nhà cung cấp và phương thức của Nhà cung cấp chỉ thực hiện nếu giá trị trong Tùy chọn là null.
Những điểm chính của việc này:
- Không sử dụng Tùy chọn.orElse, nếu nó có chứa bất kỳ câu lệnh đăng nhập nào.
- Không sử dụng tùy chọn của Cameron.orElse nếu nó chứa logic tốn nhiều thời gian.
- Không sử dụng Tùy chọn.orElse, nếu nó đang làm thay đổi một số trạng thái đối tượng.
- Sử dụng dịch vụ Tùy chọn.orElse nếu chúng ta phải trả về một hằng số, enum.
- Ưu tiên tùy chọn.orElseGetv trong các tình huống được đề cập trong 1,2 và 3 điểm.
Tôi đã giải thích điều này ở điểm 2 ( Tùy chọn chiều.map /Optional.orElse)! = Nếu if / other khác ) blog trung bình của tôi. Sử dụng Java8 như một lập trình viên chứ không phải là một lập trình viên
orElseGet
nó chỉ gọi nhà cung cấp nếu không có giá trị.