2017-06-17 7 views
1

Ich habe eine Liste von Person und wollen durch ihre idWie man optionale Tupel von Optionen zu Tupel von Optionen in Scala auspacken?

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

Danach eine Person abgerufen werden, möchte ich als ein Tupel erhalten das erste und das letzte Element einer Liste, die ein Attribut Person ist.

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

Diese Arbeit ist in Ordnung, aber jetzt möchte ich die Option[(Option[String], Option[String])] auf eine einfache (Option[String], Option[String]) verwandeln. Ist es irgendwie möglich, dies on-the-fly mithilfe der vorherigen Karte zu tun?

+0

Was sollte passiert, falls die Option Tupel keine ist? Möchten Sie stattdessen einen Standardwert? –

Antwort

1

Ich nehme an:

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

(None, None) ist ein Standardwert, hier im Falle, wenn Ihre Wahl von Tupel leer

0

Sie sind wahrscheinlich der Suche nach 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) 
}