2017-06-17 1 views
1

J'ai une liste de Person et que vous souhaitez récupérer une personne par son idComment déplier un nombre d'options optionnel pour tuple d'options dans Scala?

val person = personL.find(_.id.equals(tempId)) 

Après cela, je veux obtenir comme tuple le premier et le dernier élément d'une liste qui est un attribut de Person.

val marks: Option[(Option[String], Option[String])] = person.map { p => 
       val marks = p.school.marks 
       (marks.headOption.map(_.midtermMark), marks.lastOption.map(_.finalMark)) 
} 

bien, mais de ce travail maintenant, je veux transformer le Option[(Option[String], Option[String])] à un (Option[String], Option[String]) simple. Est-il possible de le faire à la volée en utilisant la carte précédente?

+0

Que devrait arriver dans le cas où l'option de tuple est aucun? Souhaitez-vous une valeur par défaut à la place? –

Répondre

1

Je suppose:

person.map{...}.getOrElse((None, None)) 

(None, None) est une valeur par défaut ici dans le cas si votre option de tuple est vide

0

Vous, probablement, à la recherche d'fold:

personL 
.collectFirst { 
    case Person(`tempId`, _, .., school) => school.marks 
}.fold[Option[String], Option[String]](None -> None) { marks => 
    marks.headOption.map(_.midtermMark) -> marks.lastOption.map(_.finalMark) 
}