एक संग्रह में एक विशिष्ट तत्व को खोजने के लिए नए Java8 स्ट्रीम का उपयोग करते समय, मैं इस तरह कोड लिखता हूं:
String theFirstString = myCollection.stream()
.findFirst()
.get();
यहाँ IntelliJ चेताती है कि () चेकिंग के बिना कहा जाता है (पहले)।
हालाँकि, यह कोड:
String theFirstString = myCollection.iterator().next();
... कोई चेतावनी नहीं देता।
क्या दो तकनीकों के बीच कुछ गहरा अंतर है, जो स्ट्रीमिंग दृष्टिकोण को किसी तरह से अधिक "खतरनाक" बनाता है, कि कॉलिंग () को कॉल किए बिना (।) पहले कभी नहीं मिलना महत्वपूर्ण है? चारों ओर घूमते हुए, मैं लेखों के बारे में बात कर रहा हूं कि प्रोग्रामर वैकल्पिक <> के साथ कैसे लापरवाह हैं और मान लें कि वे जब भी मिल सकते हैं () कह सकते हैं।
बात यह है, मैं अपने अपवाद को उस जगह पर फेंकना पसंद करता हूं, जहां मेरा कोड छोटी गाड़ी है, जो इस मामले में होगा जहां मुझे कॉल मिल रहा है () जब कोई तत्व नहीं मिलता है। मुझे बेकार निबंध लिखने की ज़रूरत नहीं है जैसे:
Optional<String> firstStream = myCollection.stream()
.findFirst();
if (!firstStream.isPresent()) {
throw new IllegalStateException("There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>");
}
String theFirstString = firstStream.get();
... जब तक कि () (मैं) से अनजान अपवादों को भड़काने में कुछ खतरा नहीं है?
कार्ल बेज़ेलफेल्ड की प्रतिक्रिया और हल्क की एक टिप्पणी को पढ़ने के बाद, मुझे एहसास हुआ कि ऊपर दिए गए मेरे अपवाद कोड थोड़ा अनाड़ी था, यहाँ कुछ बेहतर है:
String errorString = "There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>";
String firstString = myCollection.stream()
.findFirst()
.orElseThrow(() -> new IllegalStateException(errorString));
यह अधिक उपयोगी लगता है और संभवतः कई स्थानों पर स्वाभाविक रूप से आएगा। मुझे अभी भी ऐसा लगता है कि मैं इस सब से निपटने के लिए बिना किसी सूची के एक तत्व को लेने में सक्षम होना चाहूंगा, लेकिन यह सिर्फ इतना हो सकता है कि मुझे इस प्रकार के निर्माणों की आदत डालने की आवश्यकता है।