मुझे पता है कि शुद्ध कार्यात्मक प्रोग्रामिंग के लक्ष्यों में से एक उत्परिवर्तन को खत्म करना है, और इसलिए साइड इफेक्ट्स को रोकना है। लेकिन चलिए इसका सामना करते हैं, जावा मौजूद सभी कार्यात्मक-प्रोग्रामिंग पुस्तकालयों के साथ भी एक कार्यात्मक भाषा नहीं है। वास्तव में ऐसा लगता है कि कुछ एफपी पुस्तकालयों को यह पता है और इसकी उम्मीद है। उदाहरण के लिए कार्यात्मक जावा में, Effect
कक्षा है। जेडीआई एफपी पुस्तकालय में, Command
इंटरफ़ेस है। यह आपको अन्य चीजों के साथ - Iterable
के तत्वों के लिए गैर-लूप बॉयलरप्लेट के बिना टाइप-सुरक्षा के साथ कमांड पैटर्न लागू करता है।गुवा में कुछ भी कार्यात्मक जावा के प्रभाव के समान है?
Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach(phoneList, makeCall);
तो सवाल यह है कि क्या ऐसा कुछ है जो गुवा में है?
संपादित परिस्थितियों के एक विशिष्ट समूह के तहत, स्पष्टीकरण
मैं एक framework कि "ऊर्ध्वाधर समस्या" सबसे जावा एफपी-पुस्तकालयों में निहित के साथ मदद करता है विकसित कर रहा हूँ के लिए स्वीकार कर जवाब के बाद। तो मैं नहीं वास्तव में ऊपर दिखाए गए कोड उदाहरण बना सकता हूं: यानी, घोषणा के ठीक बाद इसे तुरंत लागू करने के उद्देश्य से, इसके सभी लंबवत-शोर icky-ness के साथ Command
का एक नया वर्ग कार्यान्वयन स्पष्ट रूप से घोषित करें।
मैं वास्तविक कमांड पैटर्न की लाइनों के साथ और सोच रहा था, जहां कहीं और घोषित कई संभावित आदेश हो सकते हैं, और उनमें से केवल एक ही कोड में पारित हो जाता है जो इसे लागू करना चाहता है। इसके अलावा, मेरे ढांचे का लक्ष्य इसे कहीं और लंबवत समस्या को स्थानांतरित किए बिना कार्यात्मक-इंटरफ़ेस ऑब्जेक्ट्स (फ़ंक्शंस, भविष्यवाणी, आदेश, अन्य सरल लैम्बडा) बनाने के लिए और अधिक मूर्खतापूर्ण बनाना है। मुझे लंबे समय से एहसास हुआ है कि यह गुवा के दायरे में नहीं है। लेकिन जैसा कि कमांड-जैसे इंटरफ़ेस अन्य एफपी पुस्तकालयों में उपलब्ध है, मैं सिर्फ यह जानना चाहता था कि गुवा में एक एनालॉग मौजूद है या नहीं।
class Stuff {
private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
public static final Command<Stuff> CMD1 = commandFor(CALLS_TO.someMethod1());
public static final Command<Stuff> CMD2 = commandFor(CALLS_TO.someMethod2());
// methods exist for use elsewhere, but are conveniently also wrapped as commands
public void someMethod1() {...}
public void someMethod2() {...}
}
class Activity {
public void handleIt(List<Stuff> stuffs, Command<Stuff> doCmd) {
doSomeThings();
...
forEach(stuffs, doCmd);
...
doOtherThings();
}
}
आदेशों के लिए "पुराना शैली" तरीका बेहतर क्यों है, लेकिन फिल्टर और परिवर्तनों के लिए बेहतर नहीं है? साथ ही, मुझे पता है कि कार्यात्मक विशेषताओं को जावा 8 तक स्टॉप गैप के रूप में देखा जाता है, लेकिन आपको यह महसूस करना होगा कि जावा 8 कुछ समय बंद है, और इसे अपनाना तत्काल नहीं होगा। अभी भी परियोजनाएं जावा 5 फंस गई हैं (सौभाग्य से, मेरा नहीं)। –
यदि आप [उपयोगकर्ता मार्गदर्शिका] (http://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Caveats) पढ़ते हैं, तो आप देखेंगे कि हम पुराने-पुराने तरीके _is_ फ़िल्टर के लिए बेहतर सोचते हैं और अधिकांश समय में परिवर्तन। हर समय नहीं - यही कारण है कि हम उन विशेषताओं को प्रदान करते हैं - लेकिन अधिकांश समय। –
इसके अतिरिक्त, मूल पोस्ट का कोड उस चीज़ का एक उदाहरण प्रतीत होता है जो [गुवा टीम रोना] बनाता है (http://code.google.com/p/guava-libraries/wiki/FunctionalExplained)। –