सूची [विकल्प] में से किसी को कैसे फ़िल्टर करें?


105

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

एक तरीका निम्नलिखित का उपयोग करना है:

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

क्या अधिक "मुहावरेदार" तरीका है? यह बहुत आसान लगता है।


जवाबों:


161

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

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

23
मुझे लगता है कि एस के flatMapअलावा अन्य सूची तत्वों को संसाधित करने के लिए इस्तेमाल किया जा सकता है None, के समान है someList.flatten.map, क्योंकि एक अक्सर इन तत्वों के साथ काम करना चाहता है न flattenकि सूची को मज़ेदार से बाहर करना।
फ्रैंक

हां, मैं रफ से पूछने में हिचकिचाया कि वह फिल्टर्ड लिस्ट के साथ क्या करने की उम्मीद कर रहा है। लेकिन वहाँ भी कई परिदृश्य हैं जहाँ आप बस समतल करना चाहते हैं।
निकोलस

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

क्या एक समतल समतल प्रकार की विधि है?
cdmckay

1
यदि आप संग्रह अपरिवर्तनीय हैं, तो फाल्टमैप चाल करेगा। यदि आप संग्रह करने योग्य हैं, तो आप नहीं हैं।
निकोलस


2

catsपुस्तकालय भी है flattenOption, जो बदल जाता है किसी भी F[Option[A]]एक में F[A](जहां F[_]एक है FunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.