[英]Java 8 ifPresent vs ternary operator
你覺得什么更好(當然有論據):
Optional.ofNullable( userName )
.ifPresent( nonNullUserName -> header.setUser( createUser( nonNullUserName ) ) );
要么
header.setUser( userName == null ? createUser( userName ) : null );
createUser
方法創建xml元素,整個代碼createUser
的意圖是根據userName
存在將其設置在SOAP請求中。
我看到的第一種方法的好處是沒有無用的操作,代碼做了一件事而不是更多。 但是第二種方法可以讓你再保存一行代碼,從而看起來更簡潔。
更新:我想我錯過了一個我實際暗示的事情,它引起了一些誤解。 如果你有一些解釋,最好提供更清晰的例子。
可選被設計用作不能總是返回值的方法的返回類型,例如getFirstElementOfAList()
,如果列表為空則不能返回任何其他內容:返回null將不如返回empty可選,可能意味着第一個元素為null,而不是沒有第一個元素。
設計者並不打算將Optional用作鏈式方法的便利構造。 請參閱Stuart Marks (他在JDK上工作) 的演講 ,特別是他在第28分鍾所說的內容:
為鏈接方法的特定目的創建一個Optional通常是一個壞主意[...]
您當然可以自由地不尊重預期的設計和最佳實踐,但您的同事可能也可以自由地討厭您:-)
請注意,您發布的兩個片段不會做同樣的事情。 如果用戶名為null,則第一個不執行任何操作,而第二個將用戶設置為null(這可能反過來拋出異常或覆蓋先前的值)
我會用(假設你想要的是第一個版本):
if (userName != null) {
header.setUser(createUser(userName));
}
這是非常明確的,不濫用可選,並且不會僅為鏈式方法創建可選實例。
它們是不同的東西,一個是Object
,另一個是運算符。 你不應該在它們之間進行比較。 第一種方法可以簡化為此,它將更具可讀性和可描述性 :
Optional.ofNullable(userName).map(this::createUser).ifPresent(header::setUser);
如果你真的想在它們之間進行比較,唯一不同的就是你上面已經提到過了。 如果你處理條件或結果更復雜的操作符將導致表達式太復雜,無法讀取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.