2013-11-26 9 views
5

ich meinen CodeWie ein Try [Option [T]]

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

Gibt es einen besseren Weg, hier ist ein Try[Option[T]] in ein Try[T]

abflachen will glätten?

Antwort

6

Man könnte so etwas wie diese versuchen, die etwas sauberere ist:

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

allgemein mehr, dies wäre:

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

Der Trick ist, die Option in Try für die Verwendung von flatmap zu konvertieren.

0

Mit getOrElse, könnte man auch schreiben:

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

Sie könnten dies noch kürzer machen, aber möglicherweise auf Kosten der funktionellen Reinheit (Werfen ist eine Nebenwirkung) und Leistung (aufgrund Werfen/Fang):

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

umrechnen in Option versuchen dann abzuflachen:

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