2011-01-19 9 views
68

का संग्रह करने के लिए विकल्प [एक्स] के स्कैला संग्रह को कैसे परिवर्तित करें I Scala का पता लगाना शुरू कर रहा हूं, और जिन चीजों से मैं चिंतित हूं उनमें से एक Option प्रकार और null संबंधित त्रुटियों को खत्म करने में सक्षम होने का वादा है ।एक्स

हालांकि मैं बाहर काम करने के लिए कैसे String का संग्रह करने के लिए, की, कहते हैं, Option[String] एक सूची (या अन्य संग्रह) को बदलने के लिए सक्षम नहीं किया गया (स्पष्ट रूप से कोई भी मान कि None हैं को छान)।

दूसरे शब्दों में, मैं इस से कैसे मिलता है:

List[Option[Int]] = List(Some(1)) 

... यह करने के लिए:

List[Int] = List(1) 

मैं स्काला 2.8 का उपयोग कर रहा है कि अगर इस सवाल का जवाब पर कोई प्रभाव पड़ता है।

उत्तर

120
val list1 = List(Some(1), None, Some(2)) 
val list2 = list1.flatten // will be: List(1,2) 
+2

शर्मनाक सरल (जैसा कि मैंने आशा की थी)! धन्यवाद। – npad

+7

हालांकि यह ध्यान देने योग्य है कि यह केवल इसलिए काम करता है क्योंकि विकल्प [ए] से जेनट्रैवर्सबलऑन [ए] – kosii

+0

@kosii जैसा दिखता है (कम से कम स्केल 2.11.6 में) रूपांतरण विकल्प [ए] से है iterable [एक] –

53

शैक्षिक उद्देश्यों के लिए, यदि आप कुछ विकल्प पसंद कर सकते हैं:

scala> val list1 = List(Some(1), None, Some(2)) 
list1: List[Option[Int]] = List(Some(1), None, Some(2)) 

scala> list1 flatten 
res0: List[Int] = List(1, 2) 

// Expanded to show the implicit parameter 
scala> list1.flatten(Option.option2Iterable) 
res1: List[Int] = List(1, 2) 

scala> list1 flatMap (x => x) 
res2: List[Int] = List(1, 2) 

scala> list1 flatMap Option.option2Iterable 
res3: List[Int] = List(1, 2) 

// collect is a simultaneous map + filter 
scala> list1 collect { case Some(x) => x } 
res4: List[Int] = List(1, 2) 

Scalaz के साथ, आप कि Option[List[Int]] रिटर्न sequence कहा जाता है एक अलग आपरेशन, प्रदर्शन कर सकते हैं।

scala> import scalaz._; import Scalaz._ 
import scalaz._ 
import Scalaz._ 

scala> val list1: List[Option[Int]] = List(Some(1), None, Some(2)) 
list1: List[Option[Int]] = List(Some(1), None, Some(2)) 

scala> list1.sequence            
res1: Option[List[Int]] = None 

scala> val list2: List[Option[Int]] = List(Some(1), Some(2))   
list2: List[Option[Int]] = List(Some(1), Some(2)) 

scala> list2.sequence 
res2: Option[List[Int]] = Some(List(1, 2)) 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^