Cela peut-il être simplifié? La valeur de retour doit être Option[State .
updateStateOne(state, "SomeData") match {
case Some(updatedState) => Some(updateStateTwo(updatedState, "SomeOtherData").getOrElse(updatedState))
case None => updateStateTwo(state, "SomeOtherData")
}
Je me demande si c'est possible sans le match ... case ? p>
3 Réponses :
C'est un peu difficile à dire, mais je pense que c'est ce que vous voulez:
updateStateOne(state, "SomeData").fold(updateStateTwo(state, "SomeOtherData")
)(s => updateStateTwo(s, "SomeOtherData"))
Vous pouvez utiliser fold comme mentionné dans d'autres réponses, ou ouElse:
updateStateOne(state, "SomeData").map(s => updateStateTwo(s, "SomeOtherData")).getOrElse(updateStateTwo(state, "SomeOtherData"))
Ou map et getOrElse (qui est complètement équivalent à fold):
updateStateOne(state, "SomeData").orElse(Some(state)).map(updateStateTwo(_,"SomeOtherData"))
À la fin de la journée, cela dépend de vos préférences de style et ce que votre équipe trouve plus lisible.
def update[S](f: (S, String) => Option[S]): (S, String) => S =
(state, data) => f((state, data)).getOrElse(state)
val s1 = update(updateStateOne)(state, "SomeData")
val s2 = update(updateStateTwo)(s1, "SomeOtherData")
Vos cas
matchne renvoient pas le même type. L'un estSome [Option [State]]tandis que l'autre estOption [State].