2013-11-26 34 views
5

Chcę spłaszczyć Try[Option[T]] w Try[T]Jak spłaszczyć spróbować [Opcja [T]]

Oto mój kod

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

Czy istnieje lepszy sposób?

Odpowiedz

6

można spróbować coś takiego co jest trochę neater:

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

Bardziej ogólnie, to byłoby:

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

Sztuką jest przekształcenie Option do Try za korzystanie flatmap.

0

Korzystanie getOrElse, można również napisać:

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

Można zrobić to nawet krócej, ale być może kosztem czystości funkcjonalnej (rzucanie jest efektem ubocznym) i wydajność (ze względu na rzucanie/połowu):

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

Konwersja spróbować opcji następnie spłaszczyć:

val t = Try(Some(1)) 
val o = t.toOption.flatten 
Powiązane problemy