2011-12-16 13 views
28

मैं उन्हें एक विकल्प में रखने के लिए खाली तारों को फ़िल्टर करना चाहता हूं। इसलिए मैंने इसे अभी बनाया है:क्या स्कैला में विकल्प-एस बनाने के लिए लाइब्रेरी विधि है जो खाली तारों को ध्यान में रखती है?

def StrictOption(s: String) = s match { 
    case s if s != null && s.trim.length() > 0 => Some(s) 
    case _ => None 
} 

प्रश्न: क्या यह शायद पहले से ही मानक पुस्तकालय में है?

उत्तर

78

मुझे नहीं लगता कि मानक पुस्तकालय में एक एकल विधि है, लेकिन आप इसे अपने कार्यान्वयन से कहीं अधिक तेज़ी से कर सकते हैं।

Option(s).filter(_.trim.nonEmpty) 
+0

मैं भी 'विकल्प (रों) .map का प्रयोग करेंगे के साथ प्राप्त किया जा सकता (_। ट्रिम) .filter (_। nonempty)' एक अतिरिक्त जगहों को ट्रिम करने के लिए -लाइनर। –

5

आप तो

if (s.trim.isEmpty) None else Some(s) 

प्रदर्शन के बारे में बिल्कुल भी परवाह अगर केवल 4 अक्षर बेन जेम्स समाधान से अधिक लंबी है, और 3 गुना तेजी से चलाता है, मेरी बेंचमार्क (47 बनाम 141) में।

+2

यह s == शून्य के लिए एक NullPointerException का कारण बनता है। – mkneissl

+0

@mkneissl 'null' को स्कैला में विचार करने की आवश्यकता नहीं है, लेकिन यदि ऐसा है, तो आप इसे 'if (s == null || s.trim.isEmpty)' में बदल सकते हैं। रन टाइम बिल्कुल वही है। –

+0

प्रश्न देखें, ओपी को लगता है कि शून्य। अन्यथा मैं 99% सहमत हूं। – mkneissl

5

इसमें कुछ भी नहीं बनाया गया है; यदि प्रदर्शन कोई मुद्दा नहीं है (उदाहरण के लिए आप उपयोगकर्ता इनपुट को मान्य कर रहे हैं) बेन का फ़िल्टर सबसे अच्छा संक्षिप्त संस्करण है। आमतौर पर, प्रदर्शन एक मुद्दा नहीं होगा।

यह भी ध्यान दें कि match का उपयोग करने के लिए यह थोड़ा अजीब बात है जब आप वास्तव में कुछ भी मेल नहीं खाते हैं; यदि कोई और कथन प्राप्त करने के लिए यह और अधिक बॉयलरप्लेट है। सिर्फ इतना कहना

if (s ne null && s.trim.length > 0) Some(s) else None 

जिसके बारे में के रूप में तेजी से और कुछ भी रूप में संक्षिप्त है, जब तक कि आप अपने खुद के लिखना चाहते हैं तरीका है यह खाली स्थान के। ध्यान दें कि trim एक असाधारण मानदंड का उपयोग करता है: ऊपर कुछ भी \ u0020 (i.e. '') छंटनी नहीं है, और कुछ भी बराबर या नीचे है। तो अगर आप भी अपने खुद के लिख सकता है डिटेक्टर छंटनी की स्ट्रिंग-है-खाली, तो आप इस कार्रवाई के प्रदर्शन विशेष रूप से महत्वपूर्ण था:

def ContentOption(s: String): Option[String] = { 
    if (s ne null) { 
    var i = s.length-1 
    while (i >= 0) { 
     if (s.charAt(i) > ' ') return Some(s) 
     i -= 1 
    } 
    } 
    None 
} 
-2

विकल्प ("कुछ") कुछ ("कुछ")

विकल्प का उत्पादन (शून्य) का उत्पादन नहीं

0

यह भी एक के लिए-समझ

val res = for (v <- Option(s) if s.nonEmpty) yield v 
संबंधित मुद्दे

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