2
votes

Méthode simplifiée: fusion de deux options en un seul résultat

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>


1 commentaires

Vos cas match ne renvoient pas le même type. L'un est Some [Option [State]] tandis que l'autre est Option [State] .


3 Réponses :


2
votes

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"))


0 commentaires

2
votes

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.


0 commentaires

1
votes
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")

0 commentaires