जहाँ तक मुझे पता है, केवल दो प्रकार के कार्य हैं, विनाशकारी और रचनात्मक।
रचनात्मक कार्य करते समय, जैसा कि नाम का अर्थ है, कुछ का निर्माण करता है, एक विनाशकारी कुछ नष्ट कर देता है, लेकिन उस तरीके से नहीं जैसा आप अब सोच सकते हैं।
उदाहरण के लिए, फ़ंक्शन
Function<Integer,Integer> f = (x,y) -> x + y
एक रचनात्मक है। जैसा कि आपको कुछ निर्माण करने की आवश्यकता है। उदाहरण में आपने टूपल (x, y) का निर्माण किया । रचनात्मक कार्यों में समस्या है, अनंत तर्कों को संभालने में सक्षम नहीं होने की। लेकिन सबसे बुरी बात यह है कि आप सिर्फ एक तर्क खुला नहीं छोड़ सकते। आप बस "अच्छी तरह से, x: = 1" नहीं कह सकते हैं और हर उस y को आज़मा सकते हैं जिसे आप आज़माना चाहते हैं। आपको हर बार पूरे टपल का निर्माण करना होगा
x := 1
। तो आप के लिए क्या काम करता है वापसी देखना पसंद करता है, तो y := 1, y := 2, y := 3
आपके पास लेखन करने के लिए है f(1,1) , f(1,2) , f(1,3)
।
जावा 8 में, रचनात्मक संदर्भों को विधि संदर्भों का उपयोग करके (अधिकतर समय) संभाला जाना चाहिए क्योंकि एक रचनात्मक लंबो फ़ंक्शन का उपयोग करने का बहुत अधिक लाभ नहीं है। वे स्थिर तरीकों की तरह एक सा है। आप उनका उपयोग कर सकते हैं, लेकिन उनके पास कोई वास्तविक स्थिति नहीं है।
दूसरा प्रकार विनाशकारी है, यह कुछ लेता है और आवश्यकतानुसार इसे नष्ट कर देता है। उदाहरण के लिए, विनाशकारी कार्य
Function<Integer, Function<Integer, Integer>> g = x -> (y -> x + y)
फ़ंक्शन के रूप में वही करता है f
जो रचनात्मक था। एक विनाशकारी कार्य के लाभ हैं, आप अब अनंत तर्कों को संभाल सकते हैं, जो धाराओं के लिए विशेष रूप से सुविधाजनक है, और आप सिर्फ तर्कों को खुला छोड़ सकते हैं। अगर तुम्हें फिर से देख क्या परिणाम अगर जैसा होगा चाहते हैं तो x := 1
और y := 1 , y := 2 , y := 3
, आप कह सकते हैं h = g(1)
और
h(1)
के लिए परिणाम है y := 1
, h(2)
के लिए y := 2
और h(3)
के लिए y := 3
।
तो यहाँ आप एक निश्चित राज्य है! यह काफी गतिशील है और यह इस समय है कि हम लंबोदर से क्या चाहते हैं।
फैक्ट्री जैसे पैटर्न बहुत आसान हैं यदि आप सिर्फ एक फ़ंक्शन में रख सकते हैं जो आपके लिए काम करता है।
विनाशकारी आसानी से एक दूसरे के साथ संयुक्त होते हैं। यदि प्रकार सही है, तो आप उन्हें अपनी इच्छानुसार बना सकते हैं। इसका उपयोग करके, आप आसानी से आकारिकी को परिभाषित कर सकते हैं जो (अपरिवर्तनीय मूल्यों के साथ) बहुत आसान परीक्षण करता है!
आप एक रचनात्मक एक के साथ भी कर सकते हैं, लेकिन विनाशकारी रचना एक सूची या डेकोरेटर की तरह अच्छे और अधिक दिखती है, और रचनात्मक एक पेड़ की तरह दिखता है। और रचनात्मक कार्यों के साथ पीछे हटने जैसी चीजें सिर्फ अच्छी नहीं हैं। आप बस एक विनाशकारी एक (गतिशील प्रोग्रामिंग) के आंशिक कार्यों को बचा सकते हैं, और "बैकट्रैक" पर बस पुराने विनाशकारी फ़ंक्शन का उपयोग कर सकते हैं। यह कोड को बहुत छोटा और बेहतर पठनीय बनाता है। रचनात्मक कार्यों के साथ आपके पास सभी तर्कों को याद रखने के लिए कम या ज्यादा है, जो बहुत कुछ हो सकता है।
तो वहाँ BiFunction
क्यों नहीं है की तुलना में सवाल का अधिक होना चाहिए की आवश्यकता क्यों है TriFunction
?
सबसे पहले, आपके पास बहुत समय है बस कुछ मान हैं (3 से कम) और बस एक परिणाम की आवश्यकता है, इसलिए एक सामान्य विनाशकारी फ़ंक्शन की बिल्कुल भी आवश्यकता नहीं होगी, एक रचनात्मक एक ठीक करेगा। और मोनाड्स जैसी चीजें हैं जो वास्तव में एक रचनात्मक कार्य की आवश्यकता है। लेकिन इससे अलग, वहाँ वास्तव में बहुत सारे अच्छे कारण नहीं हैं कि वहाँ बिल्कुल क्यों है BiFunction
। इसका मतलब यह नहीं है कि इसे हटा दिया जाना चाहिए! मैं अपने मोनाड्स के लिए तब तक लड़ता हूँ जब तक मैं मर नहीं जाता!
इसलिए यदि आपके पास बहुत सारे तर्क हैं, जिन्हें आप तार्किक कंटेनर क्लास में जोड़ नहीं सकते हैं, और यदि आपको फ़ंक्शन को रचनात्मक बनाने की आवश्यकता है, तो एक विधि संदर्भ का उपयोग करें। अन्यथा विनाशकारी कार्यों की नई प्राप्त क्षमता का उपयोग करने की कोशिश करें, आप अपने आप को बहुत कम कोड लाइनों के साथ बहुत कुछ कर सकते हैं।