2010-02-07 13 views
20

मान लें कि आपके पास एक सूची है (1, "1") यह टाइप की गई सूची [कोई भी] है, जो निश्चित रूप से सही और अपेक्षित है। अब अगर मैं इसफिल्टर के लिए स्कैला संग्रह प्रकार

scala> List(1, "1") map { 
    | case x: Int => x 
    | case y: String => y.toInt 
    | } 

की सूची को मानचित्रित करता हूं जिसके परिणामस्वरूप प्रकार सूची [Int] है। मेरा सवाल यह है कि फिल्टर के लिए मानचित्र के बराबर है क्योंकि निम्न उदाहरण के परिणामस्वरूप सूची [कोई भी] होगी। क्या यह संभव है? मुझे लगता है कि इसे संकलित समय और संभावित रूप से रनटाइम पर हल किया जा सकता है?

scala> List(1, "1") filter { 
    | case x: Int => true 
    | case _ => false 
    | } 

उत्तर

24

स्काला 2.9:

scala> List(1, "1") collect { 
    | case x: Int => x 
    | } 
res0: List[Int] = List(1) 
1
अपने संशोधित प्रश्न के संबंध में

, अगर आप बस अपने partialFunction शामिल मामले में एक गार्ड का उपयोग करें, आप प्राप्त छानने:

scala> val l1 = List(1, 2, "three", 4, 5, true, 6) 
l1: List[Any] = List(1, 2, three, 4, 5, true, 6) 

scala> l1.partialMap { case i: Int if i % 2 == 0 => i } 
res0: List[Int] = List(2, 4, 6) 
+0

क्यों है एक गार्ड के साथ केवल संभव है? –

+0

क्षमा करें, यह वास्तव में बेवकूफ टिप्पणी थी। लेकिन फ़िल्टर() आंशिक मानचित्र जैसे परिणाम उत्पन्न क्यों नहीं कर रहा है? –

+1

@ जोआ 'फ़िल्टर' संग्रह के प्रकार को नहीं बदलता है, क्योंकि यह इसके तत्वों को संशोधित नहीं करता है। –

6

किसी के लिए इस सवाल के बारे में सोचते हुए कि सबसे अधिक वोट देने वाला उत्तर उनके लिए क्यों काम नहीं करता है, जागरूक रहें कि partialMap विधि का नाम बदलकर collect स्कैला 2.8 के फाइनल से पहले किया गया था रिहाई। ऐसा करें:

scala> List(1, "1") collect { 
    | case x: Int => x 
    | } 
res0: List[Int] = List(1) 

(। यह वास्तव में डैनियल सी Sobral के अन्यथा-अद्भुत जवाब पर एक टिप्पणी होना चाहिए, लेकिन एक नया उपयोगकर्ता के रूप में, मैं अभी तक टिप्पणी करने की अनुमति नहीं कर रहा हूँ)

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