जावा में कार्यात्मक प्रोग्रामिंग संभव है? [बन्द है]


42

मैं Amazon.com बुकस्टोर के माध्यम से ब्राउज़ कर रहा था और मैं "जावा डेवलपर्स के लिए कार्यात्मक प्रोग्रामिंग" पुस्तक में आया था ।

मैं कुछ बहुत ही कार्यात्मक कार्यात्मक प्रोग्रामिंग जानता हूं और 3 वर्षों से जावा में प्रोग्रामिंग कर रहा हूं।

मैं जानना चाहूंगा कि जावा में कार्यात्मक प्रोग्रामिंग भी संभव है?


2
शैली के लिए संभव है, लेकिन इसके शब्दाडंबर बहुत ज्यादा जावा के वाक्य रचना दी सहन करने के लिए हो सकता है: functionaljava.org
यूरी Zubarev

7
@nCdy JRuby की जाँच क्यों करें? कृपया अधिक विवरण प्रदान करें।
चिरोन

1
चेक ग्रूवी :-)
चींटी के

6
मुझे लगता है कि यह एक तरह का सवाल है जो जावा-द-लैंग्वेज और जावा-द-प्लेटफॉर्म के बीच अंतर को बढ़ाता है।
थॉमस ओवेन्स

2
@ ThorbjørnRavnAndersen: आपको क्या लगता है कि "कार्यात्मक कार्यक्रम" को "आलसी मूल्यांकन" द्वारा परिभाषित किया गया है? यह एक अजीब उदाहरण लगता है ...
जॉन बार्थोलोम्यू

जवाबों:


70

यह निर्भर करता है कि आप "कार्यात्मक प्रोग्रामिंग" और "संभव" से क्या मतलब है।

आप स्पष्ट रूप से एक कार्यात्मक प्रतिमान के बाद चीजों को लागू कर सकते हैं। हालाँकि, जावा भाषा इसके लिए सिंटैक्टिक शुगर प्रदान नहीं करती है, इसलिए कुछ चीजें सबसे अच्छी तरह से थकाऊ हो जाएंगी, और कुछ अन्य बहुत अधिक स्वादिष्ट होंगी।

इसी तरह, आप गैर-ओओ के रूप में मान्यता प्राप्त भाषा में ऑब्जेक्ट-ओरिएंटेड कोड को बहुत अच्छी तरह से लिख सकते हैं, जैसे सी।

जावा पुस्तकालय

ऐसी लाइब्रेरीज़ हैं जो आपको ऐसा करने में मदद कर सकती हैं, पहले से ही आपके लिए लेगवर्क कर रही हैं और आर्कषक चीजों को छिपा रही हैं:

ये आपको एक अधिक कार्यात्मक दृष्टिकोण और संभवतः अधिक परिचित वाक्यविन्यास और अर्थ के साथ जावा कोड लिखने की अनुमति देंगे, जैसा कि आप एफपी-प्रतियोगी भाषा से उम्मीद करेंगे। कारण के भीतर, वह है।

JVM भाषाएँ

और जाहिर है, आप जावा के शीर्ष पर एक कार्यात्मक भाषा को लागू कर सकते हैं । ताकि आप फिर अपनी FP भाषा के रूप में उस एक का उपयोग कर सकें। जो आपने पूछा था, उससे कहीं अधिक उच्च स्तर का अमूर्त है, लेकिन अपेक्षाकृत संदर्भ में (हालांकि मैं यहां थोड़ा धोखा दे रहा हूं, प्रदान किया गया)।

उदाहरण के लिए, देखें:

अधिक या कम कार्यात्मक JVM भाषाएँ

हालांकि वे वास्तव में वही नहीं हो सकते हैं जो आप चाहते हैं, कई अन्य भाषाएं हैं जिन्हें जावा प्लेटफ़ॉर्म पर पोर्ट किया गया है और जो आपको जावा के अपेक्षाकृत इतने मज़ेदार-उन्मुख (हाँ, दंडित इरादे) प्रकृति से मुक्त नहीं कर सकती हैं और पहले से ही आपको और अधिक दे सकती हैं लचीलापन। JRuby , Jython और Rhino (क्रमशः Ruby , Python और JavaScript / ECMAScript के लिए ) जैसे उल्लेखनीय दावेदार भी कार्यात्मक प्रोग्रामिंग के लिए दिलचस्प क्षमता प्रदान करते हैं, हालांकि वे यकीनन प्रकृति द्वारा वास्तव में कार्यात्मक प्रोग्रामिंग भाषा नहीं हैं। जेटब्रेन के कोटलिन, जबकि यह स्पष्ट रूप से स्वीकार करते हुए कि यह एक कार्यात्मक भाषा नहीं है, कुछ कार्यात्मक निर्माणों का समर्थन करता है और देखने लायक भी है।

आगे की पढाई

आप इन लेखों या वीडियो को पढ़ना या देखना भी चाह सकते हैं:


2
क्लोजर सोर्स कोड अब Github github.com/clojure/clojure
Chiron

@ 1982 की किंवदंती: मैं आपकी टिप्पणी से तेज था, मैंने पहले ही आधिकारिक clojure.org साइट पर लिंक बदल दिया :) लेकिन इसे इतनी जल्दी पकड़ने के लिए धन्यवाद! लोगों को तेजी से प्रतिक्रिया देखने के लिए अच्छा है।
हेयर स्टाइल

ABCL ( आम-lisp.net/project/armedbear ) भी है, लेकिन मुझे नहीं पता कि यह कहाँ परिपक्व / कोई परिपक्व पैमाने पर पड़ता है और यह एक आम लिस्प कार्यान्वयन है।
वेटाइन

@Vatine: दिलचस्प, यह कभी नहीं सुना था । एक त्वरित देखो और इसे जोड़ देगा।
12

1
मैं एलन पर्लीस के शब्द "ट्यूरिंग टारपिट" को कुछ ऐसा करने की कोशिश करने के लिए प्यार करता हूं, जो एक ऐसा कर सकता है (क्योंकि यह पूरा हो रहा है) लेकिन केवल इस तरह के दर्द और जटिलता के साथ कि इसका प्रयास नहीं किया जाना चाहिए।
इसका कर्क

11

मैं आपके द्वारा उल्लिखित पुस्तक पढ़ रहा हूँ। यह वास्तव में अच्छा है BTW।

हां यह जावा में कार्यात्मक होना संभव है। मुझे नहीं पता कि आप इसे किस डिग्री तक हासिल कर सकते हैं लेकिन आप कई कार्यात्मक प्रोग्रामिंग मुहावरों को लागू कर सकते हैं।

सबसे महत्वपूर्ण चीजों में से एक "मानसिकता न बदलें" मानसिकता के साथ कोड करने की कोशिश कर रहा है।

उदाहरण के लिए आप अपरिवर्तनीयता प्राप्त करने के लिए अंतिम कीवर्ड का उपयोग करते हैं। यदि आप एक डेटा संरचना का उपयोग करने जा रहे हैं, तो आपको अपरिवर्तनीय डेटा संरचनाओं में कोड करना चाहिए। Google अमरूद पुस्तकालय पहले से ही ऐसा कर रहा है।

समवर्ती प्रोग्रामिंग के लिए, आप अक्का ढांचे (अभिनेता मॉडल) पर भरोसा कर सकते हैं।

उल्लेखनीय है कि जेवीएम बायटेकोड टेल-कॉल ऑप्टिमाइज़ेशन (कम से कम अभी तक) का समर्थन नहीं करता है, जो प्रोग्रामिंग भाषाओं के लिए एक बहुत ही महत्वपूर्ण विशेषता है।


"यह ध्यान देने योग्य है कि JVM बाइटकोड का समर्थन नहीं करता है (कम से कम अभी तक) टेल-कॉल ऑप्टिमाइज़ेशन, कार्यात्मक प्रोग्रामिंग भाषाओं के लिए एक बहुत महत्वपूर्ण विशेषता है।": आपका क्या मतलब है? स्काला में TCO है।
जियोर्जियो

@ जियोर्जियो: स्काला संकलन के समय TCO करता है।
स्क्रैप्टप

@scrttp: क्या इसकी वजह से प्रदर्शन पर जुर्माना है? या संकलन-समय TCO के नुकसान क्या हैं?
जियोर्जियो

@ जियोर्जियो: मेरा मतलब है कि जावा बाइटकोड मूल रूप से इसका समर्थन नहीं करता है, जैसा कि चिरोन मूल रूप से कहा गया है। कार्यात्मक भाषाएँ इसके चारों ओर काम करती हैं, पूंछ-पुनरावर्ती कॉल को लूप में संकलित करती हैं, लेकिन यह भाषा की एक विशेषता है-> बायटेकोड संकलक, जेवीएम नहीं।
25:13

@scrwtp: चिरोन का जवाब है "यह ध्यान देने योग्य है कि जेवीएम बायटेकोड टेल-कॉल ऑप्टिमाइज़ेशन (कम से कम अभी तक) का समर्थन नहीं करता है, कार्यात्मक प्रोग्रामिंग भाषाओं के लिए एक बहुत ही महत्वपूर्ण विशेषता है।" जेवीएम पर एक कार्यात्मक भाषा के कार्यान्वयन की तरह इसे ध्वनि देना दंडित किया गया है (लेकिन हम इस पर सहमत होते हैं) यह सच नहीं है क्योंकि संकलित कोड में टेल कॉल ऑप्टिमाइज़ेशन का अनुकरण किया जा सकता है। इसलिए मैं चिरोन के कथन से सहमत हूं लेकिन मुझे यह थोड़ा भ्रामक लगता है।
जियोर्जियो

6

हां, यह निश्चित रूप से संभव है , उसी तरह से जैसे कि किसी भी ट्यूरिंग-पूर्ण भाषा / निष्पादन पर्यावरण संयोजन में संभव है। यदि आप जानते हैं कि आप क्या कर रहे हैं, तो आप इसे बहुत अच्छा प्रदर्शन कर सकते हैं।

यकीन नहीं है कि हालांकि यह कितना समझदार है। विशेष रूप से, अवगत रहें कि यह विशेष रूप से मुहावरेदार नहीं है (अर्थात यह बहुत अजीब लगेगा, आपको कुछ अपरंपरागत चीजें करनी होंगी और उन लोगों को भ्रमित करना होगा जो नियमित रूप से जावा के लिए उपयोग किए जाते हैं)

आप किसी नए फ़ंक्शन को परिभाषित करने के लिए कुछ विषम दिखने वाले कोड के साथ समाप्त करेंगे, जैसे:

Function twoStrings=new Function() {
  public Object apply(Object param1) {
    // do something to param1 and return a result
  }
}

कार्यात्मक प्रोग्रामिंग करने के लिए आपको आमतौर पर आवश्यकता होती है:

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

तो यह एक अभ्यास और यहां तक ​​कि एक दिलचस्प शौक परियोजना के रूप में संभव है। लेकिन आप वास्तव में जेवीएम / जावा पुस्तकालयों तक पहुँचने के फायदे को बनाए रखते हुए गंभीर कार्यात्मक प्रोग्रामिंग करना चाहते हैं, तो क्लोजर अब तक मेरी राय में आपका सबसे अच्छा विकल्प है।

चूंकि क्लोज़र का कोर वास्तव में जावा में लिखा गया है, इसलिए यह वास्तव में एक बहुत ही दिलचस्प उदाहरण है कि कैसे एक अच्छी नई आधुनिक भाषा वाक्य रचना के पीछे गड़बड़ विवरणों को छिपाते हुए जावा में कार्यात्मक प्रोग्रामिंग करना है। रुचि रखने वालों के लिए गिजहब पर क्लोजर सोर्स कोड है


दिलचस्प बात यह है कि, मैंने देखा है कि IntelliJ IDEA के नवीनतम संस्करण में इन अनाम लोगों को संपादक में प्रदर्शन के लिए और अधिक कॉम्पैक्ट रूप में बदल दिया जाएगा। बेमानी अपराध को छिपाने का एक अच्छा काम करता है। बेशक यह सब अप्रासंगिक होगा जावा 8.
बेन हार्डी

4

जावा में कुछ हद तक कार्यात्मक होना संभव है। ऐसा करना गंभीर रूप से दर्दनाक है । के बजाय

myList.each { doSomething(it); }

आपके पास कुछ ऐसा है:

myList.each(new Function() { public void do(Object arg) { something(); }})

और यदि आप फर्स्ट क्लास ऑब्जेक्ट के रूप में क्लोजर और फ़ंक्शंस के साथ सच्ची कार्यात्मक प्रोग्रामिंग चाहते हैं, तो दूसरी भाषा चुनें। स्काला, क्लोजर, ग्रूवी सभी जेवीएम पर चलते हैं और विरासत जावा कक्षाओं के साथ बातचीत कर सकते हैं। ।


अनाम कक्षाओं के बजाय ब्लॉक का उपयोग करने के बारे में कार्यात्मक प्रोग्रामिंग नहीं है। जावा 8 में ब्लॉक होने वाले हैं, इसलिए आपका पोस्ट किया गया कोड अधिक सुरुचिपूर्ण दिखाई देगा, लेकिन यह कार्यात्मक प्रोग्रामिंग नहीं होगा।
चिरोन

@Legend: मैं समझता हूँ कि, लेकिन जाहिर है कि यह अच्छी तरह से नहीं समझा।
केविन क्लाइन

यह ओवरसाइट / अंडरसाइट है। किसी भी भाषा के साथ, आपको वास्तव में फ़ंक्शन को परिभाषित करना होगा, आप उस हिस्से को छोड़ नहीं सकते। तो जावा लगभग संक्षिप्त रूप में है, आपको बस इतना करना है कि फंक्शन ऑब्जेक्ट को अज्ञात बना दिया जाए। आप ऐसा कर सकते हैं: फ़ंक्शन f = नया फ़ंक्शन () {सार्वजनिक शून्य करना () {}}; .... फिर ... उस फ़ंक्शन को कॉल करें .... myMethodToCallAFunction (फ़ंक्शन f) {f.do ()} ... यह है, bros और brolinis। हालत से समझौता करो।
अलेक्जेंडर मिल्स

3

उत्तर एक शानदार "हां, निश्चित रूप से" है, फिर भी मेरी राय में कई कार्यात्मक भाषाओं में सबसे महत्वपूर्ण विशेषताओं में से एक उत्कृष्ट प्रकार की प्रणाली है। आप जावा में इसे कभी भी प्रबंधित नहीं कर पाएंगे।

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


2

खैर, हर तरह की चीजें संभव हैं। सी में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग करना संभव है; यह सिर्फ एक बहुत अच्छा विचार नहीं है।

जावा एफपी के लिए डिज़ाइन नहीं किया गया था, इसलिए यदि आप पूरी तरह से एफपी शैली में सब कुछ करने की कोशिश कर रहे हैं, तो आपको समस्याएं होंगी। आप इसके साथ काम करने के बजाय, भाषा से लड़ेंगे। और सिर्फ भाषा नहीं - वहाँ भी सभी अद्भुत मुफ्त जावा पुस्तकालय हैं। तो शुद्ध एफपी के लिए मत जाओ; एफपी के पीछे के कुछ विचारों को लें और उन्हें अपने जावा कोड में एकीकृत करें, लेकिन यह समझें कि आप सभी विचारों के साथ ऐसा नहीं कर सकते ।


0

आप OpenJDK टीम द्वारा अपने नवीनतम OpenJDK 8 बायनेरिज़ को डाउनलोड करने और नए लंबो एक्सप्रेशंस और कलेक्शंस एपीआई (अन्य के बीच) में पेश किए गए नए कार्यात्मक मुहावरों के साथ खेलने के लिए प्रोत्साहित करते हैं। आप एक स्पष्ट कार्यात्मक शैली में कार्यक्रम कर सकते हैं। "जावा में कार्यात्मक प्रोग्रामिंग देखें ?" एक JDK8 कलेक्शंस के लिए, जावा, फ़ंक्शनलजैव और लैंबडैज की तरह जावा 8 लिबास के साथ तुलना।


-3

यह संभव लग सकता है लेकिन यह शुद्ध कार्यात्मक प्रोग्रामिंग नहीं होगा। यह अनिवार्य प्रोग्रामिंग के लिए परिणाम हो सकता है।

वहाँ कोई पूछ नहीं है कि क्यों वह संभव कार्यात्मक प्रोग्रामिंग से मतलब है जैसा कि हेयरम द्वारा उल्लेख किया गया है। यह रहा:

यह निर्भर करता है कि आप "कार्यात्मक प्रोग्रामिंग" और "संभव" से क्या मतलब है।

कार्यात्मक प्रोग्रामिंग की अलग-अलग परिभाषाएं या अर्थ नहीं हो सकते हैं, हालांकि इसके कई स्पष्टीकरण हो सकते हैं।
OOP की तरह, क्या हम पूछ सकते हैं "OOP से आपका क्या मतलब है?"।
निश्चित रूप से बहुत सारे स्पष्टीकरण होंगे लेकिन यह सिर्फ एक उद्देश्य, ओओपी के उद्देश्य से संबंधित होगा।
यही क्रियात्मक प्रोग्रामिंग पर लागू होता है ।

जब हम कहते हैं कि कार्यात्मक का अर्थ है कि कार्यक्रम कार्य करते हैं।
कार्यों की भूमिका एक मूल्यांकन किए गए तर्क / पैरामीटर को वापस करना है (तर्क चर है जो फ़ंक्शन को कॉल करते समय अभिव्यक्ति आया है जबकि पैरामीटर चर है जो फ़ंक्शन घोषणा का एक हिस्सा है)।

साथ ही फ़ंक्शन हमेशा उसी परिणाम को लौटाएगा जब समान तर्क पास हो जाएंगे। इस तरह से बग्स से बचना आसान है या भविष्य के बग को डिबग करना आसान है। कार्यात्मक प्रोग्रामिंग द्वारा हम वैश्विक चर को संशोधित करने जैसे दुष्प्रभावों से बच सकते हैं।

जावास्क्रिप्ट में उदाहरण:

function increment(lis){
    return lis.map(
        function (x){
            return x+2;
        }
    );
}

var myList = [4, 7, 2, 3];
console.log(increment(myList));
console.log(myList);

फ़ंक्शन इंक्रीमेंट ऑब्जेक्ट के अंदर प्रत्येक तत्व में 1 मान जोड़ता है और परिणाम लौटाता है। माईलिस्ट का मूल्य नहीं बदला लेकिन जब हम उन कार्यों को कहते हैं तो हमने उस वस्तु के तत्वों में जोड़ा मूल्य देखा।

मेरी प्रतिक्रिया के रूप में जावा में कार्यात्मक प्रोग्रामिंग संभव है? , मेरा मानना ​​है कि जावा में सच्ची कार्यात्मक प्रोग्रामिंग होना संभव नहीं है। क्योंकि जावा वास्तव में OOP होने के लिए डिज़ाइन किया गया है जिसमें यह अनिवार्य प्रोग्रामिंग का विस्तार करता है और इसे स्थिरता के लिए बेहतर बनाता है। जब एक वस्तु, परिवर्तनशील आदि की स्थिति बदल गई है, तो वह पहले से ही एक अनिवार्य प्रोग्रामिंग है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.