मैं लैंबडास और डिफॉल्ट मेथड इंटरफेस के बारे में कई नए जावा 8 फीचर्स की सराहना करता हूं। फिर भी, मैं अभी भी जाँच किए गए अपवादों से ऊब गया हूं। उदाहरण के लिए, यदि मैं किसी वस्तु के सभी दृश्यमान क्षेत्रों को सूचीबद्ध करना चाहता हूं, तो मैं इसे बस लिखना चाहूंगा:
Arrays.asList(p.getClass().getFields()).forEach(
f -> System.out.println(f.get(p))
);
फिर भी, चूंकि get
विधि एक जाँच अपवाद को फेंक सकती है, जो Consumer
इंटरफ़ेस अनुबंध से सहमत नहीं है , तो मुझे उस अपवाद को पकड़ना होगा और निम्नलिखित कोड लिखना होगा:
Arrays.asList(p.getClass().getFields()).forEach(
f -> {
try {
System.out.println(f.get(p));
} catch (IllegalArgumentException | IllegalAccessException ex) {
throw new RuntimeException(ex);
}
}
);
हालाँकि ज्यादातर मामलों में मैं सिर्फ एक अपवाद के रूप में फेंका जाना चाहता हूं RuntimeException
और कार्यक्रम को संकलित त्रुटियों के बिना संभालता हूं या नहीं।
इसलिए, मैं चेक किए गए अपवादों की झुंझलाहट के लिए मेरे विवादास्पद समाधान के बारे में आपकी राय रखना चाहूंगा। उस अंत तक, मैंने एक सहायक इंटरफ़ेस ConsumerCheckException<T>
और एक उपयोगिता समारोह बनाया rethrow
( डोभाल की टिप्पणी के अनुसार अद्यतन ) इस प्रकार है:
@FunctionalInterface
public interface ConsumerCheckException<T>{
void accept(T elem) throws Exception;
}
public class Wrappers {
public static <T> Consumer<T> rethrow(ConsumerCheckException<T> c) {
return elem -> {
try {
c.accept(elem);
} catch (Exception ex) {
/**
* within sneakyThrow() we cast to the parameterized type T.
* In this case that type is RuntimeException.
* At runtime, however, the generic types have been erased, so
* that there is no T type anymore to cast to, so the cast
* disappears.
*/
Wrappers.<RuntimeException>sneakyThrow(ex);
}
};
}
/**
* Reinier Zwitserloot who, as far as I know, had the first mention of this
* technique in 2009 on the java posse mailing list.
* http://www.mail-archive.com/javaposse@googlegroups.com/msg05984.html
*/
public static <T extends Throwable> T sneakyThrow(Throwable t) {
throw (T) t;
}
}
और अब मैं लिख सकता हूँ:
Arrays.asList(p.getClass().getFields()).forEach(
rethrow(f -> System.out.println(f.get(p)))
);
मुझे यकीन नहीं है कि चेक किए गए अपवादों को चालू करने के लिए यह सबसे अच्छा मुहावरा है, लेकिन जैसा कि मैंने समझाया, मैं जाँच किए गए अपवादों से निपटने के बिना अपने पहले उदाहरण को प्राप्त करने का एक और अधिक सुविधाजनक तरीका चाहूंगा और यह सबसे सरल तरीका है जो मुझे मिला। इसे करने के लिए।
sneakyThrow
के rethrow
लिए अंदर का उपयोग कर सकते थे RuntimeException
। वैकल्पिक रूप से आप प्रोजेक्ट@SneakyThrows
लोम्बोक से एनोटेशन का उपयोग कर सकते हैं जो समान कार्य करता है।
Consumer
रों में forEach
जब समानांतर का उपयोग कर समानांतर फैशन में निष्पादित किया जा सकता Stream
है। एक फेंकने योग्य उपभोक्ता के साथ उठाया गया तो कॉलिंग थ्रेड को प्रचारित करेगा, जो 1) अन्य समवर्ती चलने वाले उपभोक्ताओं को नहीं रोकेगा, जो उचित नहीं हो सकता है, और 2) यदि एक से अधिक उपभोक्ता कुछ फेंकते हैं, तो ही फेंकने वालों में से एक को कॉलिंग थ्रेड द्वारा देखा जाएगा।