2013-11-26 5 views
5

मैं एक Try[T]कैसे समतल करने के लिए एक कोशिश [विकल्प [टी]]

यहाँ में एक 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) 
     } 
    } 
} 

वहाँ एक बेहतर तरीका है है?

उत्तर

6

आप कुछ इस तरह जो एक छोटे से neater है की कोशिश कर सकते:

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

चाल flatmap प्रयोग करने के लिए Try में Option कन्वर्ट करने के लिए है।

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

Convert तो विकल्प करने की कोशिश समतल:

val t = Try(Some(1)) 
val o = t.toOption.flatten 
संबंधित मुद्दे