2016-02-09 4 views
5

में विकल्प [टी] के साथ स्मार्ट से निपटने के लिए मैं स्कैला का उपयोग करके कुछ कोड विकसित कर रहा हूं और मैं कुछ Option[T] वाले संग्रहों के बीच मूलभूत परिवर्तन को स्मार्ट तरीके से हल करने की कोशिश कर रहा हूं।स्कैला

मान लें कि हम निम्न सूची

val list: List[(A, Option[B])] = // Initialization stuff 

है और हम निम्न सूची

val transformed: List[(B, A)] 
सभी Option[B] कि Some[B] का मूल्यांकन के लिए

प्राप्त करने के लिए list करने के लिए एक परिवर्तन लागू करने के लिए चाहते हैं। ऐसा करने का सबसे अच्छा तरीका यह है कि परिवर्तनों की निम्नलिखित श्रृंखला लागू करना है:

val transformed = 
    list.filter(_.isDefined) 
     .map { case (a, Some(b)) => (b, a) } 

हालांकि मुझे लगता है कि मुझे कुछ याद आ रही है। Option[T] एस से निपटने का सबसे अच्छा तरीका कौन सा है?

उत्तर

13

आप collect उपयोग कर सकते हैं:

val transformed = list.collect { 
    case (a, Some(b)) => (b, a) 
} 

एकत्रित करते हैं, डॉक्स में परिभाषित किया गया है:

इस सूची समारोह है, जिस पर सभी तत्वों के लिए एक आंशिक समारोह लगाने से एक नया संग्रह बनाता है परिभाषित।

मतलब, यह केवल उन तत्वों के लिए परिणाम उत्पन्न करता है जो आपके आंशिक कार्य में परिभाषित किसी भी मामले से मेल खाते हैं। मुझे इसे filter और map के रूप में सोचना पसंद है।