स्काला 2.7.7 का उपयोग करना:उच्च आदेश फ़ंक्शंस का उपयोग करके विकल्पों की सूची कैसे फ़्लैट करें?
अगर मैं विकल्प की एक सूची है, मैं उन्हें का उपयोग कर एक-समझ के लिए समतल कर सकते हैं:
val listOfOptions = List(None, Some("hi"), None)
listOfOptions: List[Option[java.lang.String]] = List(None, Some(hi), None)
scala> for (opt <- listOfOptions; string <- opt) yield string
res0: List[java.lang.String] = List(hi)
मैं इस शैली पसंद नहीं है, और नहीं बल्कि एक का प्रयोग करेंगे HOF।
scala> listOfOptions.flatMap(opt => if (opt.isDefined) Some(opt.get) else None)
res1: List[java.lang.String] = List(hi)
Intuitively मैं अपेक्षा की होगी काम करने के लिए निम्नलिखित है, लेकिन यह नहीं है:,
scala> List.flatten(listOfOptions)
<console>:6: error: type mismatch;
found : List[Option[java.lang.String]]
required: List[List[?]]
List.flatten(listOfOptions)
यहां तक कि निम्नलिखित की तरह यह काम करना चाहिए लगता है, लेकिन नहीं करता है यह प्रयास भी स्वीकार किए जाने की वर्बोज़ है 'टी:
scala> listOfOptions.flatMap(_: Option[String])
<console>:6: error: type mismatch;
found : Option[String]
required: (Option[java.lang.String]) => Iterable[?]
listOfOptions.flatMap(_: Option[String])
^
सबसे अच्छा मैं के साथ आ सकते हैं
है:
scala> listOfOptions.flatMap(_.toList)
res2: List[java.lang.String] = List(hi)
... लेकिन मुझे विकल्प को सूची में बदलने की ज़रूरत नहीं है। यह गुंजाइश लगता है।
कोई सलाह?
अरे हाँ। धन्यवाद! मैंने एक बार फ्लैटमैप (ओ => ओ) पर ठोकर खाई लेकिन तुरंत इसके बारे में भूल गई। क्यों flatMap (_) समान रूप से काम नहीं करता है साथ ही एक उत्सुक चीज भी है। – Synesso