2017-02-23 33 views
0

我有一個方法findUrl()是採取UserPermission作爲參數和查詢數據庫,並實現了一些邏輯來找到這個User以逗號分隔訪問的網址串。如何創建使用Java 8可選Java方法的空安全版

我想開發這種方法的一個空安全的版本,以相同的 UserPermission作爲參數,然後返回一個Optional這將是 空,如果傳遞給它的值中至少有一個爲空或findUrl方法的返回null。我寫了下面的代碼,但它看起來像一個空檢查基礎實施和我沒有看到使用可選,使代碼更簡潔的多少好處。

public Optional<String> nullSafeFindUrl(User user, Permissions permissions) { 
    if ((Optional.ofNullable(user)).isPresent() && (Optional.ofNullable(permissions)).isPresent()) { 
     return Optional.ofNullable(findUrl(user.get(), permissions.get())); 
    } else { 
     return Optional.empty(); 
    } 
} 

有沒有更好的方法來使代碼更具可讀性?

+0

「但更多的似乎是基於空檢查實行」究竟是什麼意思這件事? –

+5

爲了記錄:使用選配的參數是不完全的最佳做法;見http://stackoverflow.com/questions/31922866/why-should-java-8s-optional-not-be-used-in-arguments ...是的,瘋了,你只應該**返回**可選對象;但不要將它們用作參數或字段。 – GhostCat

+0

@ E_net4像這裏我用if(user.isPresent()&& permissions.isPresent())來檢查值是否存在於可選方式中,就像我會做空檢查它們是否爲可選類型 –

回答

2

你需要的是flatmap和地圖一氣呵成。

return user.flatMap(u -> permissions.map(perm -> findUrl(u, perm)); 

這將返回一個空的可選或可選的,如果兩者都有效

2

答案是類似於灰,但我會添加一些說明也使得它可以幫助別人

返回值

invoke flatMap上的第一個可選項,所以如果這是空的,傳遞給它的lambda表達式 根本不會被執行,這個調用將只返回 一個空的可選項。相反,如果用戶存在,則將其用作 函數返回FlatMap方法所要求的Optional的函數。 這個函數的調用身在第二個可選的地圖,所以如果它不包含任何 權限,該函數將返回一個空可選的,因此將整個空值 安全的方法。

最後,如果用戶和權限都存在 ,則作爲參數傳遞給map方法的lambda表達式可以安全地使用 調用原始的findUrl方法。

所以應用該方法實施上述後得到了降低到單行

public Optional<String> nullSafeFindUrl(User user, Permissions permissions) { 
    (Optional.ofNullable(user)).flatMap(u -> (Optional.ofNullable(permissions)).map(p -> findUrl(p, u))); 

}