2013-02-27 232 views
12

मैं लूप और पैटर्न मिलान के आधार पर विभिन्न केस क्लास ऑब्जेक्ट्स की एक सूची बना रहा हूं। मैं डिफॉल्ट केस (अनिवार्य रूप से सूची फ़िल्टर करना, और एक चरण में टाइप करने के लिए मानचित्रण) को मारने वाले आइटम को छोड़ना (छोड़ना) चाहता हूं।केवल अगर पैटर्न मिलान

मैं संभवतः सभी संभावनाओं को देखने के लिए स्कैला के लिए बहुत नया हूं। मेरे प्रयास:

val events = for (ev <- data) yield { 

     ev.sport match { 
      case "FOOTBALL" => new FootballEvent(ev) 
      case "SOCCER" => new SoccerEvent(ev) 
      case _ => None 
     } 

    } 

मैं बाद में सूची को फ़िल्टर कर सकता है, लेकिन मैं वहाँ संदेह है :) यह कर के कुछ फैंसी स्काला रास्ता

कृपया मुझे पता है अगर तुम यह कैसे सबसे अच्छा किया जाना चाहिए के किसी भी विचार है चलो !

+0

यदि तीन या अधिक के बजाय केवल दो मामले हैं, तो यह एक 'के लिए ... उपज' में किया जा सकता है - यहां एक उदाहरण है: '{{(x) <- कुछ (कोई नहीं: विकल्प [स्ट्रिंग])} उपज "यहां नहीं मिलनी चाहिए" ' –

उत्तर

27

यह वाक्य रचना उपज है कि नहीं है, लेकिन आप पैटर्न मिलान के साथ इकट्ठा का उपयोग कर सकते हैं: बेहतर ज्ञात

val events = data.collect { ev => ev.sport match { 
    case "FOOTBALL" => new FootballEvent(ev) 
    case "SOCCER" => new SoccerEvent(ev) 
}} 

विपरीत .map और .foreach यह अभ्यस्त पर "अन्य" मामले असफल और इसके बजाय सिर्फ बेजोड़ आइटम ड्रॉप।

+1

जब आपने पहले जवाब दिया था, तो मैं आपको इसे छोड़ दूंगा, लेकिन हम में से कोई भी इसे पहले प्रयास पर सही नहीं मिला। ठीक है, ऐसा लगता है कि आपने सिंटैक्स त्रुटि तय की है :) –

+0

ने बी 4 एकत्रित नहीं किया। – javadba

9

for-yield में मानक फ़िल्टर x <- y if f(x,..) के साथ प्राप्त किया गया है। यहां एक उदाहरण दिया गया है जो आंशिक फ़ंक्शन का उपयोग करता है।

val m: PartialFunction[Event, Event] = ev => ev.sport match { 
    case "FOOTBALL" => new FootballEvent(ev) 
    case "SOCCER" => new SoccerEvent(ev) 
}; 

for { ev <- data if m.isDefindAt(ev) 
     val x = m(ev) 
} yield x 

// or, without the temporary binding: 
for (ev <- data if m.isDefindAt(ev)) yield m(ev) 

नोट Traversable.collect अन्य जवाब में बताया गया है, जो इस हस्ताक्षर def collect[B](pf: PartialFunction[A, B]): CC[B] और रिटर्न "एक नया संग्रह प्रत्येक तत्व जिस पर यह परिभाषित किया गया है करने के लिए दिया आंशिक समारोह पीएफ लागू करने और इकट्ठा करने से उत्पन्न है के साथ समानता परिणाम"।

if बिना एक वैकल्पिक है bwroga की भिन्नता से हटा नहीं दिया जवाब:

for { ev <- data; 
     x <- ev.sport match { 
     case "FOOTBALL" => Some(new FootballEvent(ev)) 
     case "SOCCER" => Some(new SoccerEvent(ev)) 
     case _ => None 
     } 
} yield x 

बाद में प्रारंभिक मानचित्र के बाद (यानी "0 आइटम") या कुछ (यानी "1 आइटम") कोई नहीं के माध्यम से पुनरावृत्ति द्वारा इस फिल्टर ।


कोई मुझे बताओ कि 'नई' scaladoc में अलग-अलग तरीकों से जोड़ने के लिए, मैं आभारी होगी कर सकते हैं।

+1

धन्यवाद! मैं सभी दृष्टिकोणों की कोशिश कर रहा हूं – Joernsn

+0

'scala.collection.Traversable' के लिए मौजूदा स्केलडॉक्स से लिंक करें http://www.scala-lang.org/api/current/scala/collection/Traversable.html – Davos