2013-11-26 6 views
5

voglio appiattire un Try[Option[T]] in un Try[T]come appiattire un try [Opzione [T]]

Ecco il mio codice

def flattenTry[T](t: Try[Option[T]]) : Try[T] = { 
    t match { 
    case f : Failure[T] => f.asInstanceOf[Failure[T]] 
    case Success(e) => 
     e match { 
     case None => Failure[T](new Exception("Parsing error")) 
     case Some(s) => Success(s) 
     } 
    } 
} 

C'è un modo migliore?

risposta

6

Si potrebbe provare qualcosa di simile, che è un po 'più ordinato:

val t = Try(Some(1)) 
val tt = t.flatMap{ 
    case Some(i) => Success(i) 
    case None => Failure(new Exception("parsing error")) 
} 

più genericamente, questo sarebbe:

def flattenTry[T](t: Try[Option[T]]) : Try[T] = { 
    t.flatMap{ 
    case Some(s) => Success(s) 
    case None => Failure(new Exception("parsing error")) 
    }  
} 

Il trucco è quello di convertire il Option in Try per l'utilizzo di flatmap.

0

Utilizzando getOrElse, si potrebbe anche scrivere:

def flattenTry[T](t: Try[Option[T]]): Try[T] = { 
    t flatMap { o => o map (Success(_)) getOrElse Failure(new Exception("parsing error")) } 
} 

si potrebbe fare questo ancora più breve, ma possibilmente a costo di purezza funzionale (lancio è un effetto collaterale) e le prestazioni (a causa di lancio/cattura):

def flattenTry[T](t: Try[Option[T]]): Try[T] = { 
    Try(t.get getOrElse { throw new Exception("parsing error") }) 
} 
1

Converti cercare di opzione, quindi appiattire:

val t = Try(Some(1)) 
val o = t.toOption.flatten