के साथ शून्य-सुरक्षित विधि श्रृंखला, गुवा का Optional
पैटर्न बहुत अच्छा है, क्योंकि यह अस्पष्टता को शून्य के साथ हटाने में मदद करता है। transform
विधि शून्य-सुरक्षित विधि श्रृंखला बनाने के लिए बहुत उपयोगी है जब श्रृंखला का पहला भाग अनुपस्थित हो सकता है, लेकिन उपयोगी नहीं है जब श्रृंखला के अन्य भाग अनुपस्थित हैं।वैकल्पिक
यह प्रश्न Guava Optional type, when transformation returns another Optional से संबंधित है, जो अनिवार्य रूप से एक ही प्रश्न पूछता है लेकिन एक अलग उपयोग मामले के लिए जो मुझे लगता है कि Optional
(हैंडलिंग त्रुटियों) का इच्छित उपयोग नहीं हो सकता है।
एक विधि Optional<Book> findBook(String id)
पर विचार करें। findBook(id).transform(Book.getName)
अपेक्षित के रूप में काम करता है। यदि कोई पुस्तक नहीं मिली है तो हमें Absent<String>
मिल जाएगा, यदि कोई पुस्तक मिली है तो हमें Present<String>
मिल जाएगा।
सामान्य मामले में जहां इंटरमीडिएट विधियां null
/absent()
वापस आ सकती हैं, कॉल को श्रृंखलाबद्ध करने का एक शानदार तरीका प्रतीत नहीं होता है। उदाहरण के लिए, मान लें कि Book
में एक विधि Optional<Publisher> getPublisher()
है, और हम एक पुस्तक के प्रकाशक द्वारा प्रकाशित सभी पुस्तकें प्राप्त करना चाहते हैं। प्राकृतिक वाक्यविन्यास findBook(id).transform(Book.getPublisher).transform(Publisher.getPublishedBooks)
प्रतीत होता है, हालांकि यह विफल हो जाएगा क्योंकि transform(Publisher.getPublishedBooks)
कॉल वास्तव में Optional<Optional<Publisher>>
लौटाएगा।
पर Optional
पर विधि के समान उचित लगता है जो Optional
पर एक फ़ंक्शन स्वीकार करेगा। यह वर्तमान कार्यान्वयन की तरह कार्य करेगा, सिवाय इसके कि यह केवल वैकल्पिक रूप से फ़ंक्शन के परिणाम को लपेट नहीं देगा। (Present
के लिए) कार्यान्वयन पढ़ सकता है:
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
return function.apply(reference);
}
Absent
के लिए कार्यान्वयन transform
से अपरिवर्तित है:
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
checkNotNull(function);
return Optional.absent();
}
यह भी अच्छा होगा यदि वहाँ एक रास्ता तरीकों कि वापसी null
को संभालने के लिए के रूप में विरोध किया थीं या नहीं विरासत वस्तुओं के साथ काम करने के लिए Optional
पर। इस तरह की एक विधि transform
की तरह होगी लेकिन फ़ंक्शन के परिणामस्वरूप बस Optional.fromNullable
पर कॉल करें।
मैं उत्सुक हूं कि किसी और ने इस त्रासदी में भाग लिया है और अच्छे कामकाज पाए हैं (जिसमें आपकी Optional
कक्षा लिखना शामिल नहीं है)। मुझे गुवा टीम से भी सुनना अच्छा लगेगा या इस मुद्दे से संबंधित चर्चाओं की ओर इशारा किया जाएगा (मुझे मेरी खोज में कोई नहीं मिला)।
क्या आपने [चर्चा समूह] (https://groups.google.com/forum/#!forum/guava-discuss) की कोशिश की है? यहां पोस्ट करने पर विचार करें, भले ही यह इस (अच्छी तरह से लिखित) प्रश्न को इंगित करें। इस प्रश्न के लिए –