2011-05-11 23 views
10

आप जावा में कार्यात्मक प्रोग्रामिंग का अनुकरण कैसे कर सकते हैं, विशेष रूप से, चीजों को संग्रहित करने के लिए किसी फ़ंक्शन को मानचित्र जैसे काम करना?
जावा में कार्यात्मक प्रोग्रामिंग

 
map(func, new String[]{"a","b","c"}); 

कम से कम वर्बोज़ & अजीब यह करने के लिए जिस तरह से क्या है?

उत्तर

9

दुर्भाग्य से कार्यात्मक प्रोग्रामिंग का सभी प्रयास जावा में इसे करने के लिए वर्बोज़ और/या अजीब का कुछ हिस्सा होगा।

सबसे प्रत्यक्ष तरह से (जैसे this one form Guava के रूप में) एक Function इंटरफेस प्रदान और तरीकों कि लेने के सभी प्रकार प्रदान करते हैं और इसे कहते हैं (जैसे Collections#transfrom() जो करता है कि मैं क्या लगता है कि आपके map() विधि करना चाहिए) के लिए है। ऐसा नहीं है कि जावा की योजना बनाई लैम्ब्डा फ़ीचर ध्यान दिया जाना चाहिए

Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() { 
    public OutputType apply(InputType input) { 
     return frobnicate(input); 
    } 
}); 

:

के बारे में बुरी बात यह है कि आप Function लागू करने की आवश्यकता है और अक्सर एक अनाम भीतरी वर्ग है, जो एक बहुत वर्बोज़ वाक्य रचना है के साथ ऐसा है 8 यह काफी आसान बना देगा (और संभवतः तेज़ भी!)। में बराबर कोड lambdas (की वर्तमान फार्म) इस प्रकार दिखाई देगा:

Collection<OutputType> result = Collections.transform(input, SomeClass::frobnicate); 

या अधिक वर्बोज़, लेकिन अधिक लचीला:

Collection<OutputType> result = Collections.transform(input, in -> frobnicate(in)); 
5

मैंने इस तरह की चीजों के लिए lambdaj और functionaljava का उपयोग किया है। और वहाँ शायद दूसरों रहे हैं ...

2

बस समारोह आप सूची में लागू करना चाहते हैं लपेट एक कक्षा या एक इंटरफ़ेस के साथ।

public interface Func { 
    Object f(Object input); 
} 

public void map (Func func, Object[] arr) { 
    for(int i=0;i<arr.legnth;i++) { 
    arr[i] = func.f(arr[i]); 
    } 
} 

map(
    new Func() { public Object f(Object input) { return input; } };, 
    new String[]{"a","b"}); 
1

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

@ जोआचिम का उदाहरण लें।

Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() { 
    public OutputType apply(InputType input) { 
     return frobnicate(input); 
    } 
}); 

यह 12 प्रतीकों का उपयोग करता है, नजदीकी ब्रैकेट की गणना नहीं करता है। सादे जावा में एक ही चीज़ दिखती है।

List<OutputType> list = new ArrayList(); 
for(InputType in: input) 
    list.add(frobnicate(in)); 

यह 7 प्रतीकों का उपयोग करता है।

आप जावा में कार्यात्मक प्रोग्रामिंग कर सकते हैं, लेकिन आपको जावा की प्राकृतिक प्रोग्रामिंग शैली का उपयोग करने से अधिक वर्बोज़ और अजीब होने की उम्मीद करनी चाहिए।

1

आप ओपनजेडीके 8 डाउनलोड कर सकते हैं जो अगले वर्ष प्रोडक्शन रिलीज के लिए निर्धारित है और कार्यात्मक प्रोग्रामिंग के लिए नए लैम्ब्डा एक्सप्रेशन का उपयोग करें। उदाहरण के लिए http://macgyverdev.blogspot.se/2012/10/functional-programming-in-java.html देखें कि संग्रह बंद करने में इन बंदियों का उपयोग कैसे किया जाएगा और वे प्रीवा जावा 8 समाधान जैसे गुवा और लैम्ब्डाजे के साथ तुलना कैसे करेंगे।

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