簡體   English   中英

Java 8 ifPresent vs三元運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM