2011-04-26 11 views
5

मैंने मानचित्र के उपयोग के माध्यम से कोड को बहुत सरल बनाने के लिए उच्च आदेश कार्यों का उपयोग करने के विचार के बारे में जोएल ऑन सॉफ्टवेयर पर एक लेख पढ़ा और कम किया। उन्होंने उल्लेख किया कि जावा में करना मुश्किल था। लेख: http://www.joelonsoftware.com/items/2006/08/01.htmlमैं मानचित्र जैसे उच्च आदेश फ़ंक्शन कैसे लिख सकता हूं, या जावा में कम कर सकता हूं?

नीचे दिए गए लेख से उदाहरण के लिए, एक सरणी के माध्यम से लूप होता है, और fn कि सरणी में प्रत्येक तत्व पर एक तर्क के रूप पारित किया गया था फ़ंक्शन का उपयोग करता:

function map(fn, a) 
{ 
    for (i = 0; i < a.length; i++) 
    { 
     a[i] = fn(a[i]); 
    } 
} 

यह समान लागू किया जाएगा नीचे करने के लिए व्यवहार में:

map(function(x){return x*2;}, a); 
map(alert, a); 

आदर्श रूप में मैं सरणियों, या किसी भी प्रकार यदि संभव हो तो के संग्रह पर काम करने के एक नक्शे के समारोह लिखने के लिए करना चाहते हैं।

मैं इंटरनेट पर चारों ओर देख रहा हूं, और मुझे इस विषय पर संसाधन खोजने में मुश्किल हो रही है। सबसे पहले, जावा में अज्ञात कार्य संभव हैं? क्या यह किसी अन्य तरीके से करना संभव है? क्या यह जावा के भविष्य के संस्करण में उपलब्ध होगा? यदि संभव हो, तो मैं इसे कैसे कर सकता हूं?

मुझे कल्पना है कि यदि जावा में यह संभव नहीं है तो कुछ प्रकार की 'पैटर्न'/तकनीक है जो लोग समान प्रभाव प्राप्त करने के लिए उपयोग करते हैं, क्योंकि मुझे लगता है कि अज्ञात फ़ंक्शन सॉफ़्टवेयर दुनिया में एक बहुत ही शक्तिशाली टूल हैं। एकमात्र ऐसा प्रश्न जिसे मैं ढूंढने में सक्षम था यह था: Java generics - implementing higher order functions like map और यह मुझे बिल्कुल समझ में नहीं आता है।

उत्तर

6

Guava नक्शा प्रदान करता है (लेकिन यह बजाय transform कहा जाता है, और Lists तरह उपयोगिता कक्षाओं में है और Collections2)। हालांकि, यह गुना/कम नहीं प्रदान करता है।

किसी भी मामले में, transform प्रयोग करने के लिए वाक्य रचना योजना में map उपयोग की तुलना में वास्तव में भद्दा लगता है। यदि आप सही हैं तो यह आपके बाएं हाथ से लिखने की कोशिश करने जैसा है। लेकिन, यह जावा है; आप क्या उम्मीद करते हैं। :-P

3

एकल विधि अज्ञात कक्षाएं जावा में एक अज्ञात फ़ंक्शन लिखने का एक समान, लेकिन अधिक वर्बोज़ प्रदान करती हैं। उदाहरण के लिए, आप हो सकता है:

Iterable<Source> foos = ...; 
Iterable<Destination> mappedFoos = foos.map(new Function<Source, Destination>() 
{ 
    public Destination apply(Source item) { return ... } 
}); 

एक कार्यात्मक शैली के साथ एक जावा पुस्तकालय का एक उदाहरण के लिए, देखें Guava

+1

वास्तव में ऐसा लगता है कि जब जावा अंततः लैम्ब्डा अभिव्यक्ति प्राप्त करता है, तो वे इस तरह के अज्ञात वर्ग में परिवर्तनीय होंगे। – hammar

2
interface Func<V,A> { 
    V call (A a); 
} 

static <V,A> List<V> map (Func<V,A> func, List<A> as) { 
    List<V> vs = new ArrayList<V>(as.size()); 
    for (A a : as) { 
     Vs.add(func.call(a)); 
    } 
    return vs; 
} 
0

Paguro has an open-source implementation of higher order functions। प्रारंभिक परीक्षण यह देशी जावा के लिए देशी जावा के रूप में 98% जितना तेज़ दिखाता है। अंतर्निहित संग्रह को संशोधित किए बिना संचालन का संचालन आलसी रूप से लागू होता है। यह अपरिवर्तनीय (और कभी-कभी परिवर्तनीय) क्लोजर संग्रह के प्रकार-सुरक्षित संस्करणों के लिए आउटपुट करता है। Transformable is built into Paguro's unmodifiable and immutable collections and interfaces। इनपुट के रूप में कच्चे java.util संग्रह का उपयोग करने के लिए, बस इसे xform() फ़ंक्शन से लपेटें।

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

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