स्कैप में ऑप्शन के साथ जावा में रैपिंग नल-रिटर्निंग विधि?


107

माना कि मेरे पास एक तरीका है, session.get(str: String): Stringलेकिन आपको नहीं पता कि यह आपको एक स्ट्रिंग या एक अशक्त लौटा देगा, क्योंकि यह जावा से आता है।

क्या इसके बजाय स्काला में इसका इलाज करने का एक आसान तरीका है session.get("foo") == null? शायद कुछ जादू की तरह लागू होते हैं ToOption(session.get("foo"))और फिर मैं इसे स्काला की तरह व्यवहार कर सकता हूं

ToOption(session.get("foo")) match {
    case Some(_) =>;
    case None =>;
}

4
अधिक विकल्प के लिए ट्रिक देखें blog.tmorris.net/scalaoption-cheat-sheet
Landei

4
ऊपर दिया गया लिंक blog.tmorris.net/posts/scalaoption-cheat-sheet होना चाहिए ।
जसक लस्कॉस्की

जवाबों:


182

Optionसाथी वस्तु की applyविधि नल संदर्भों से एक रूपांतरण समारोह के रूप में कार्य करता है:

scala> Option(null)
res4: Option[Null] = None

scala> Option(3)   
res5: Option[Int] = Some(3)

19

Optionवस्तु एक है applyविधि है कि वास्तव में करता है:

var myOptionalString = Option(session.get("foo"));

5

ध्यान दें कि जावा वस्तुओं के साथ काम करते समय यह अपेक्षित रूप से काम नहीं करेगा:

val nullValueInteger : java.lang.Integer = null
val option: Option[Int] = Option(nullValueInteger)
println(option)  // Doesn't work - zero value on conversion

val nullStringValue : String = null
val optionString: Option[String] = Option(nullStringValue)
println(optionString) // Works - None value

1
मैं 2.11.8 स्केला के साथ भागा। दूसरी पंक्ति ने NullPointerException को फेंक दिया। छठी पंक्ति को कुछ (शून्य) मिला, जैसा कि आपने अपेक्षा की थी, कोई नहीं।
जॉन लिन

1. ऑप्शनस्ट्रीमिंग में ऑप्शन के बजाय कुछ का इस्तेमाल किया - मूल उत्तर में बदल दिया। 2. केवल स्केला 2.12.5 में सत्यापित
DekelM

-3

यह एक बहुत पुराना विषय है लेकिन एक अच्छा है!

यह सही है कि ट्राय टू ऑप्शन के किसी भी गैर-अपवाद परिणाम को परिवर्तित करने के परिणामस्वरूप कुछ ...

scala> Try(null).toOption
res10: Option[Null] = Some(null)

... क्योंकि कोशिश शून्यता की जाँच के बारे में नहीं है, बल्कि अपवादों को कार्यात्मक रूप से संभालने का एक तरीका है।

एक अपवाद को पकड़ने की कोशिश करना और इसका उपयोग करना कि सुविधा के लिए एक विकल्प में परिवर्तित करना केवल एक अपवाद होने की स्थिति में कोई नहीं दिखाएगा।

scala> Try(1/0).toOption
res11: Option[Int] = None

आप उन मूल्यों को संरक्षित करना चाहते हैं जो ट्राई से बाहर आते हैं। वह अशक्त हो सकता है।

लेकिन यह भी सच है कि मानक कभी-कभी काफी भ्रमित होता है ...

scala> Try(null).toOption
res12: Option[Null] = Some(null)

scala> Option(null)
res13: Option[Null] = None

यह व्यवहार थोड़ा असंगत है लेकिन यह एक तरह से कोशिश और विकल्प दोनों के उपयोग को दर्शाता है।

आप एक अभिव्यक्ति से बाहर आने के लिए कोशिश करते हैं जो अपवादों को फेंक सकता है, और आप अपवाद के बारे में परवाह नहीं करते हैं।

जो मूल्य निकल सकता है वह बहुत अच्छी तरह से अशक्त हो सकता है। अगर ऑक्शन ने किसी को नहीं दिया, तो आप एक अपवाद और अशक्त के बीच अंतर नहीं कर सकते , और यह सुंदर नहीं है!

स्टैंडअलोन, आप किसी चीज़ के अस्तित्व को रोकने के लिए विकल्प का उपयोग करते हैं। तो उस मामले में कुछ (अशक्त) कोई नहीं है, और यह समझ में आता है, क्योंकि उस मामले में अशक्त कुछ की अनुपस्थिति का प्रतिनिधित्व करता है। यहां कोई अस्पष्टता नहीं है।

यह बताना महत्वपूर्ण है कि किसी भी मामले में रेफ़ेंसियल ट्रांसपेरेंसी तब से नहीं टूटी है। विकल्प ऑप्शन के रूप में समान नहीं है ()

यदि आपको वास्तव में बीओटीएच अपवाद सुरक्षा और अशक्त सुरक्षा को लागू करने की आवश्यकता है , और आपके कोड को वास्तव में अशक्त और अपवाद के बीच अंतर करने की आवश्यकता नहीं है , तो आपको बस दोनों प्रतिमानों को संयोजित करने की आवश्यकता है! क्योंकि ठीक है, कि तुम क्या चाहते हो, है ना?

आप इसे एक तरह से कर सकते हैं ...

scala> Try(Option(null)).getOrElse(None)
res23: Option[Null] = None

scala> Try(Option(3/0)).getOrElse(None)
res24: Option[Int] = None

scala> Try(Option(3)).getOrElse(None)
res25: Option[Int] = Some(3)

... या एक और ...

scala> Try(Option(null)).toOption.flatten
res26: Option[Null] = None

scala> Try(Option(3/0)).toOption.flatten
res27: Option[Int] = None

scala> Try(Option(3)).toOption.flatten
res28: Option[Int] = Some(3)

... या हास्यास्पद रूप से उनमें से एक माँ ...

scala> Option(Try(null).getOrElse(null))
res29: Option[Null] = None

scala> Option(Try(3/0).getOrElse(null))
res30: Option[Any] = None

scala> Option(Try(3).getOrElse(null))
res31: Option[Any] = Some(3)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.