आप वास्तव में एक नए इंटरफ़ेस के साथ विस्तार Consumer
(और Function
आदि) कर सकते हैं जो अपवादों को संभालता है - जावा 8 के डिफ़ॉल्ट तरीकों का उपयोग करके !
इस इंटरफ़ेस पर विचार करें (विस्तार Consumer
):
@FunctionalInterface
public interface ThrowingConsumer<T> extends Consumer<T> {
@Override
default void accept(final T elem) {
try {
acceptThrows(elem);
} catch (final Exception e) {
// Implement your own exception handling logic here..
// For example:
System.out.println("handling an exception...");
// Or ...
throw new RuntimeException(e);
}
}
void acceptThrows(T elem) throws Exception;
}
फिर, उदाहरण के लिए, यदि आपके पास एक सूची है:
final List<String> list = Arrays.asList("A", "B", "C");
यदि आप forEach
अपवादों को फेंकने वाले कुछ कोड के साथ (उदाहरण के साथ ) इसका उपभोग करना चाहते हैं, तो आप पारंपरिक रूप से एक कोशिश या कैच सेट सेट करेंगे:
final Consumer<String> consumer = aps -> {
try {
// maybe some other code here...
throw new Exception("asdas");
} catch (final Exception ex) {
System.out.println("handling an exception...");
}
};
list.forEach(consumer);
लेकिन इस नए इंटरफ़ेस के साथ, आप इसे लंबोदर एक्सप्रेशन से जोड़ सकते हैं और कंपाइलर को शिकायत नहीं होगी:
final ThrowingConsumer<String> throwingConsumer = aps -> {
// maybe some other code here...
throw new Exception("asdas");
};
list.forEach(throwingConsumer);
या यहां तक कि बस इसे अधिक रसीला होने के लिए डाल दिया! "
list.forEach((ThrowingConsumer<String>) aps -> {
// maybe some other code here...
throw new Exception("asda");
});
अपडेट : ऐसा लगता है कि ड्यूरियन नामक एक बहुत अच्छा उपयोगिता पुस्तकालय का हिस्सा है जिसे एरर्स कहा जाता है जिसका उपयोग इस समस्या को बहुत अधिक लचीलेपन के साथ हल करने के लिए किया जा सकता है। उदाहरण के लिए, ऊपर मेरे कार्यान्वयन में मैंने स्पष्ट रूप से त्रुटि हैंडलिंग नीति ( System.out...
या) को परिभाषित किया हैthrow RuntimeException
) को , जबकि ड्यूरियन के त्रुटियां आपको उपयोगिता विधियों के एक बड़े सूट के माध्यम से मक्खी पर एक नीति लागू करने की अनुमति देती हैं। इसे साझा करने के लिए धन्यवाद , @NedTwigg !.
नमूना उपयोग:
list.forEach(Errors.rethrow().wrap(c -> somethingThatThrows(c)));