2013-01-17 24 views
14

में सूची [विकल्प] से मूल्य रखने वाली सभी प्रविष्टियां प्राप्त करें क्या List[Option[T]] की सभी प्रविष्टियां एक मूल्य होने के साथ संभव है?स्कैला

उदाहरण:

val list = List(None, Some(1), None, Some(2)) 
list.filter(_.isDefined).map(_.get) 

परिणाम:

List[Int] = List(1, 2) 

वहाँ एक कदम में यह करने के लिए एक विधि है? यह एक आम मामला है, है ना?

उत्तर

25

ध्यान दें कि

list.flatten 

बस के रूप में करना होगा कुंआ।

6

कि के लिए collect हाँ, आप उपयोग कर सकते हैं:

list.collect { case Some(x) => x } 

collect एक PartialFunction[A,B] लेता है और सभी तत्वों जिस पर यह परिभाषित है और बाकी को छोड़ देता है है करने के लिए इस समारोह लागू होता है।

संपादित:

gpampara के रूप में सही ढंग से उल्लेख किया है, इस मामले flatten के लिए पर्याप्त होगा। collect अतिरिक्त बाधाएं और/या रूपांतरित होने पर सही उपकरण होगा।

+0

धन्यवाद। आप स्कैला पर भरोसा कर सकते हैं कि हमेशा एक और अधिक सुरुचिपूर्ण तरीका है ;-) – deamon

+2

एक और अधिक सुरुचिपूर्ण तरीका बस है: 'list.flatten' – gpampara

+0

@gpampara धन्यवाद, आप मुझे सही साबित करते हैं :-) – deamon

4

तुम भी उपयोग कर सकते हैं:

list.flatMap(x => x) 

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

scala> a.flatMap(x => x) 
res0: List[Int] = List(1, 2) 

कैसे/क्यों यह काम करता है, आप इस लेख की जाँच हो सकता है की व्याख्या के लिए: http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/

+0

हाँ, यह काम करता है। लेकिन मुझे समझ में नहीं आता क्यों। दस्तावेज़ों के अनुसार 'flatMap' को 'विकल्प' वापस करना होगा। – deamon

+1

http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/ यहां अच्छी व्याख्या है – Arg

+0

मेरी गलती 'flatMap' को देखना था 'विकल्प' वर्ग, लेकिन निश्चित रूप से मुझे 'List.flatMap' को देखना पड़ा। – deamon

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

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