2016-05-18 10 views
8

मैं जावा 8 के लिए नया हूं, मैं उपभोक्ता जावा दस्तावेज़ में आया और यह कहता है, "उपभोक्ता को साइड इफेक्ट्स के माध्यम से काम करने की उम्मीद है।" क्या कोई बता सकता है कि ऐसा क्यों कहा जाता है?जावा 8 उपभोक्ता और दुष्प्रभाव

+3

यदि आप कार्यात्मक प्रोग्रामिंग के लिए उपयोग नहीं किया जाता है, तो उस भाषा का आपके लिए बहुत अधिक मतलब नहीं होगा। विचार यह है कि "शुद्ध" कार्यों को केवल उनके इनपुट से पढ़ना चाहिए, और केवल उनके वापसी मूल्यों को लिखना चाहिए (इसलिए कोई साइड इफेक्ट नहीं होगा - फ़ंक्शन चलाने का एकमात्र प्रभाव यह है कि आपको वापसी मान मिलता है।) कार्य जो बदलते हैं कुछ (डेटा संरचना संशोधित करें, आईओ चलाएं, आदि), दुष्प्रभाव होने के लिए कहा जाता है। रिटर्न वैल्यू के बिना एक समारोह में बेहतर दुष्प्रभाव होते थे, अन्यथा यह कुछ भी नहीं कर रहा है। –

उत्तर

4

Consumer javadoc के अनुसार, उपभोक्ता को void accept(T) हस्ताक्षर वाले विधि के साथ घोषित किया जाना चाहिए। नतीजतन, विधि एक मूल्य वापस नहीं कर सकता है। यदि इसका दुष्प्रभाव नहीं होता है तो इसमें किसी भी प्रभाव को करने की कोई क्षमता नहीं होगी।

+0

धन्यवाद। मुझे आपकी बात समझ में आ गई। – user6348242

0

अधिकांश कार्यात्मक इंटरफेस केवल इतना होने के लिए हैं - कार्यात्मक इंटरफेस, जिसका सख्ती से मतलब है कि वे इनपुट स्वीकार करते हैं, कुछ गणना करते हैं, और आउटपुट लौटाते हैं। वे किसी भी राज्य को संशोधित नहीं करना चाहते हैं। Consumer अपवाद है क्योंकि यह किसी भी मान वापस नहीं करता है; इसका उद्देश्य पूरी तरह से कुछ राज्यों को संशोधित करना है।

7

उपभोक्ता निम्नलिखित हस्ताक्षर

void accept(T t); 

विधि एक इनपुट के रूप टी लेता है और कुछ भी (शून्य) वापस नहीं करता है, और इसलिए आप इसे से कुछ भी वापस नहीं कर सकते हैं और विधि की जगह के साथ विधि accept है उस मूल्य के साथ कॉल करें जो यह लौटाता है।

एक पक्ष प्रभाव होगा एक प्रिंट बयान का एक उदाहरण

list.stream.foreach(System.out::println); 

foreach एक तर्क के रूप में एक उपभोक्ता लेता है। यदि आप इसके बारे में सोचते हैं, तो ऐसी एकमात्र उपयोगी चीज जो आप इस तरह के तरीके से कर सकते हैं वह दुनिया को बदलना है (यानी, एक राज्य को बदलना)।

कि के विपरीत एक pure function, एक समारोह है कि किसी भी राज्य उत्परिवर्तित नहीं है, यह उदाहरण

Function<Integer,Integer> fn = x -> x*x; 

यहाँ fn के लिए एक इनपुट लेता होगा, और कुछ देता है, कोई साइड इफेक्ट नहीं है (यह कुछ भी म्यूट नहीं करता है), यह एक पूर्णांक प्राप्त करता है और शांतिपूर्वक अपने वर्ग को वापस देता है।

संबंधित मुद्दे