我正在使用這個邏輯,new Employee()如果找不到員工,我會嘗試回傳。
但是,當request.getId()is時null,它會引發例外,我正在等待它執行orElse()部分。但是,事實并非如此。那么,我應該使用另一種可選方法,例如orElseGet()還是ifPresentOrElse()?
我怎樣才能以聰明的方式解決這個問題?
Employee employee = employeeRepository.findById(request.getId())
.orElse(new Employee());
更新:如果使用Optional不是一個好主意,我想使用以下方法:
Employee employee = new Employee();
if (id != null) {
employee = employeeRepository.findById(id)
.orElse(new Employee());
}
有什么想法嗎?
uj5u.com熱心網友回復:
正如評論中提到的,Optional在這種情況下不會做任何事情。要解決它,您需要自己處理null價值。您可以通過將request.getId()returnOptional本身設為 an 來做到這一點(因為它可以是null)。
現在您可以Optional使用運算子鏈接這些 's flatMap()。
public class MyRequestClass {
private Long id;
// Change your getter to this, or make a new one, eg. 'getOptionalId()'
public Optional<Long> getId() {
return Optional.ofNullable(id);
}
}
現在您可以將代碼重構為:
Employee employee = request
.getId()
.flatMap(employeeRepository::findById) // Using flatMap() in stead of map()
.orElseGet(Employee::new); // I changed this part so that new Employee() is
// called lazily when no Employee was found in
// the database (or when the request has no ID)
uj5u.com熱心網友回復:
對 the 進行 null 處理request.getId()并避免陷入例外怎么樣?
使用以下之一,假設employeeRepository#findById回傳Optional<Employee>:
Employee employee = Optional.ofNullable(request.getId())
.flatMap(id -> employeeRepository.findById(id))
.orElse(new Employee());
Employee employee = Optional.ofNullable(request.getId())
.flatMap(EmployeeRepository::findById)
.ofElse(new Employee());
uj5u.com熱心網友回復:
使用 Optional 隱藏空檢查 - 是一種反模式
隱式空檢查沒有任何問題,例如if (something == null),更多內容Optional并非旨在執行空檢查。
以下是JDK 開發人員 Stuart Marks回答的摘錄:
Optional 的主要用途如下:(幻燈片 36)
Optional旨在為庫方法回傳型別提供有限的機制,其中明確需要表示“無結果”,并且使用for 極有可能導致錯誤。null從 an 鏈接方法的能力
Optional無疑是非常酷的,并且在某些情況下它減少了條件邏輯的混亂。但很多時候這行不通。一個典型的代碼異味是,它不是使用方法鏈接來處理從某個方法回傳的 Optional 的代碼,而是從可以為 null 的東西創建一個 Optional,以便鏈接方法并避免條件。
(重點是我的)
從上面的參考中,很明顯OptionalJDK 中引入了為回傳型別提供有限的機制。任何其他情況,例如使用 optional 作為欄位,將其存盤到 Collection 中,創建一個 optional 來替換空檢查或/和為了在其上鏈接方法,都被認為是濫用Optional.
還可以看看 Stuart Marks 的另一個答案:是否應該使用 Optional.ofNullable() 進行空值檢查?
也就是說id,當id在請求物件中時,通過 檢索員工的更簡潔null的方法如下:
public Employee getEmployeeById(Request request) {
Long id = request.getId();
if (id == null) return new Employee();
return employeeRepository.findById(id)
.orElse(new Employee());
}
如果在代碼中出現了兩次填充不舒服new Employee(),那么您可以像這樣重新實作它:
public Employee getEmployeeById(Request request) {
Long id = request.getId();
Optional<Employee> result = Optional.empty();
if (id != null) result = employeeRepository.findById(id);
return id == null || result.isEmpty() ? new Employee() : result.get();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/491622.html
