2012-04-11 6 views
75

यदि मेरे पास स्कैला में List[Option[A]] है, तो None मानों को फ़िल्टर करने का बेवकूफ तरीका क्या है?फ़िल्टर करने के लिए कैसे कोई भी सूची सूची [विकल्प]?

val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye")) 
someList.filter(_ != None) 

वहाँ एक और अधिक "मुहावरेदार" रास्ता है:

एक तरह से निम्नलिखित का उपयोग करने के लिए है? यह बहुत आसान प्रतीत होता है।

+1

संबंधित परिणाम प्रकार रखना चाहते हैं: https: // stackoverflow.com/questions/4730842/how-to-transform-scala-collection-of-optionx-to-collection-of-x – dskrvk

उत्तर

120

आप एक ही समय में विकल्पों में से छुटकारा पाना चाहते हैं, तो आप उपयोग कर सकते हैं flatten:

scala> someList.flatten 
res0: List[String] = List(Hello, Goodbye) 
+18

मैं जोड़ता हूं कि 'flatMap' का उपयोग' none' 'के अलावा सूची तत्वों को संसाधित करने के लिए किया जा सकता है एस, 'someList.flatten.map' के समान, क्योंकि अक्सर इन तत्वों के साथ काम करना चाहता है और न केवल मस्ती से सूची को' फ़्लैट करें '। – Frank

+0

हां, मुझे रैफ से पूछने में हिचकिचाहट है कि वह फ़िल्टर की गई सूची के साथ क्या करने की उम्मीद कर रहा है। लेकिन ऐसे कई परिदृश्य भी हैं जहां आप बस फ़्लैट करना चाहते हैं। – Nicolas

+0

कभी-कभी मैं 'विकल्प' ऑब्जेक्ट्स की सामग्री को पुनर्प्राप्त करना चाहता हूं, लेकिन दूसरी बार मुझे उन्हें 'विकल्प [ए]' के रूप में रहने की आवश्यकता है। मुझे 'विकल्प [ए]' - कूल फीचर के लिए अधिक से अधिक उपयोग मिल रहे हैं। – Ralph

10

someList.filter(_.isDefined) आप के रूप में List[Option[A]]