2015-09-03 29 views
0

想要獲得更多的FP方式開發。在我的情況下,DAO可以返回Object或None。 但我如果不存在的所有對象更多FP方式代替if/else

實現這樣

def get(...): String = { 
    val user1 = UserDAO.getUser(...) 
    val user1 = UserDAO.getUser(...) 
    val userN = UserDAO.getUser(...) 

if (user1.isEmpty || ser2.isEmpty || ...) { 
return "error" 
} else { 
... 
} 

它可以實現更多的功能性的方式保證。沒有混亂如果/其他?

BR!

+1

一個if-else表達式是不是「不FP 「,但要擺脫不必要的」回報「。 –

回答

2

考慮

if (Seq(user1,user2,userN).exists(_.isEmpty)) "error" 
else "" 

隨着existsisEmpty我們檢查是否任何用戶沒有定義。這種方法會暫停迭代Seq,因爲遇到謂詞的第一項。

3

讓你傳遞給的getUser的參數列表,並使用mapforall

val userIds = List(...) 
val dbUsers = userIds.map(UserDAO.getUser) 

,如果你不想使用if/else語句可以做到這一點,雖然它讓人感覺有點倒過來,可能完全模糊了你的意圖:

dbUsers.collectFirst { case user if user.isEmpty => "error" } getOrElse { "ok" } 

然而,據我所知的if/else是不是真的那麼多當在FP(或中階開發商至少)皺着眉頭,所以你可以爲它寫在一個更具表現力,也簡明的方式:

if (dbUsers.forall(_.nonEmpty)) "ok" else "error" 

,或者在反邏輯:

if (dbUsers.exists(_.isEmpty)) "error" else "ok" 
0

可以使用的,修真flatmap在所有3 Option[User]並指定所有3個用戶存在會發生什麼。

然後使用getOrElse指定應該發生什麼,如果任何這些用戶的是一個None

def get(...): String = { 
    val namesOpt = for { 
     u1 <- UserDAO.getUser(...) 
     u2 <- UserDAO.getUser(...) 
     u3 <- UserDAO.getUser(...) 
    } yield u1.name + u2.name + u3.name 

    namesOpt getOrElse "error" 
} 
0
val users = /* collection of Option[User] types */ 
users.find(!_.isDefined).fold("ok") { _ => "error" } 

或..

users.find(_.isEmpty).fold("ok") { _ => "error" } 
+0

'!_。isDefined'可以被重寫爲'_.isEmpty'。 – VasyaNovikov