हमारे मुंह से Google अमरूद कूल-एड को वापस थूकने के बाद, और VAVR और इसके चमचमाते आदर्शों के साथ हमारे नए उत्साह में सिर-पहले गोता लगाते हुए, मान लें कि हम map()पिंग एक Stream कर रहे हैं, foldLeft() एक Traversable, या समान पर, और आंतरिक कार्यों में से एक एक चेक अपवाद फेंकता है। अब हम कंपाइलर त्रुटियों, अनचाहे अपवादों को देख रहे हैं।

मुहावरेदार वीएवीआर के साथ ऐसे अपवादों को आदर्श रूप से कैसे संभाला जाए। परिणामी कोड कैसा दिखता है, पैटर्न क्या हैं। हमारे पास Options और Trys हैं... यह सब एक साथ कैसे आता है।

ओह, और डरपोक अपवादों जैसी तरकीबें हमें रूचि नहीं देती हैं।

1
Vivid Inc. 29 अप्रैल 2020, 10:35
1
मूल्य-आधारित Try के बारे में अच्छी बात यह है कि आपको इस प्रबंधन के बारे में निर्णय लेने की आवश्यकता है। यदि आपका मैपिंग फ़ंक्शन विफल हो सकता है, तो क्या आप चाहते हैं कि आपका परिणाम Try<Traversable<O>> या Traversable<Try<O>> हो? जवाब आपको बताएगा कि कैसे लपेटना है।
 – 
chrylis -cautiouslyoptimistic-
29 अप्रैल 2020, 11:01

1 उत्तर

सबसे बढ़िया उत्तर

आप एक ऐसे फ़ंक्शन को कनवर्ट करने के लिए CheckedFunction[0-8].liftTry() का उपयोग कर सकते हैं जो चेक किए गए अपवादों को कुल फ़ंक्शन में फेंकता है जो Try में लिपटे मूल फ़ंक्शन का परिणाम देता है। यदि मूल फ़ंक्शन बिना फेंके एक मान लौटाता है, तो इसे Success में लपेटा जाएगा, यदि यह फेंकता है, तो अपवाद को Failure में लपेटा जाएगा।

फिर आपको कई मूल्यों के संदर्भ में त्रुटियों को संभालने के तरीके के बारे में निर्णय लेने की आवश्यकता होगी। यहां कुछ उदाहरण दिए गए हैं कि आप Try मानों के समूह के साथ क्या कर सकते हैं।

Array<String> input = Array.of(
        "123", "456", "789", "not a number", "1111", "another non-number"
);

// try and parse all the strings
Array<Try<Integer>> trys = input.map(CheckedFunction1.liftTry(Integer::parseInt));

// you can take just the successful values
Array<Integer> values = trys.flatMap(Try::iterator);

// you can look just for the failures
Array<Throwable> failures = trys.filter(Try::isFailure).map(Try::getCause);

// you can partition by the outcome and extract values/errors
Tuple2<Traversable<Integer>, Traversable<Throwable>> partition =
    trys.partition(Try::isSuccess)
        .map(
            seq -> seq.map(Try::get),
            seq -> seq.map(Try::getCause)
        );

// you can do a short-circuiting parse of the original sequence
// this will stop at the first error and return it as a failure
// or take all success values and wrap them in a Seq wrapped in a Try
Try<Seq<Integer>> shortCircuit = Try.sequence(
    input.iterator() //iterator is lazy, so it's not fully evaluated if not needed
         .map(CheckedFunction1.liftTry(Integer::parseInt))
);
// Failure(java.lang.NumberFormatException: For input string: "not a number")

बेशक, आप Array के स्थान पर किसी अन्य vavr संग्रह का उपयोग कर सकते हैं।

3
Nándor Előd Fekete 29 अप्रैल 2020, 14:16