2013-11-26 48 views
5

我想一個Try[Option[T]]壓扁成Try[T]如何扁平化一個Try [選項[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) 
     } 
    } 
} 

有沒有更好的辦法?

回答

6

你可以嘗試這樣的事情這是一個小整潔:

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

更一般地,這將是:

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

的竅門是在Option轉換成Try使用flatmap。

0

使用getOrElse,你也可以這樣寫:

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

你可以讓這個更短,但也可能在功能純度的成本(投擲的副作用)和性能(由於投擲/捕獲):

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

轉換嘗試選項,然後壓平:

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