2009-11-19 13 views
5

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

मैंने एक कक्षा रखने के बारे में सोचा जिसमें केवल "फ़ंक्शन पॉइंटर" रैपर की तरह एक फ़ंक्शन शामिल है, लेकिन मुझे नहीं लगता कि इसका उपयोग रचना के लिए कैसे किया जा सकता है।

संपादित करें: प्रश्न होमवर्क से संबंधित है। इसके अलावा, यह मानचित्र की रेखाओं के साथ कई रचनाओं को संभालने में सक्षम होना चाहिए (नक्शा (नक्शा (stepFunction())) ("मैप" विधि के माध्यम से दिए गए समारोह में "मानचित्र")।

+0

तो जब आप कहते हैं कि आप मानचित्र करना चाहते हैं (नक्शा (नक्शा (stepFunction())), तो इसका मतलब है कि आपको सूचियों की सूचियों की एक सूची मिली है और आप सभी के प्रत्येक तत्व पर stepFunction को कॉल करना चाहते हैं उस पदानुक्रम में बाल सूची? मैं अभी भी पूरा करने की कोशिश कर रहा हूं कि मैं पूरी तरह से स्पष्ट नहीं हूँ। –

+0

सं। मूल रूप से यह सौदा है: मेरे पास किसी भी समय केवल तीन चीजें हैं: चरण कार्य, वर्तमान मूल्य, और मूल मूल्य। यदि Seq.map (someFunctionToMapWith) कभी लागू नहीं किया गया था तो वर्तमान मान = आधार मान = चरण फ़ंक्शन (पिछला आधार मान)। हालांकि, अनुक्रम पर नक्शा लागू होने पर, प्रत्येक बार जब मैं वर्तमान मान को बदलने के लिए seq.tail() का आह्वान करता हूं, तो मैं पहले मूल मान को बदलता हूं और इसे दिए गए फ़ंक्शन का उपयोग करके इसे आगे बढ़ाता हूं: curr = mapFunc (stepFunc (मूल मान)) (आधार मूल्य भी अद्यतन किया गया है)। यदि नक्शा कई बार बुलाया गया था, तो यह नक्शा होना चाहिए (नक्शा (.. नक्शा (stepFunc (आधार मूल्य)) ..))। – EpsilonVector

उत्तर

5

जावा और इसके दर्द में आपका स्वागत है।

interface Function<T> { 
    public T eval(T argument); 
} 

class Lazy<T> { 
    private Iterator<T> source; 
    private Function<T> filter; 
    Lazy(final Iterator<t> source, final Function<T> filter) { 
     this.source = source; 
     this.filter = filter; 
    } 
    public T step() { 
     return filter.eval(source.next()); 
    } 
} 
+0

मुझे नहीं लगता कि यह मुझे रचना के साथ कैसे मदद करता है। शायद मुझे यह उल्लेख करना चाहिए था कि यह मानचित्र() के कई अनुप्रयोगों का जवाब देने में सक्षम होना चाहिए। जिस व्यवहार को मैं प्राप्त करना चाहता हूं वह नक्शा है (नक्शा (नक्शा (stepFunction())) (उदाहरण के लिए)। – EpsilonVector

+0

फिर आलसी इटरेटर का विस्तार करें ... विचार आपको सही दिशा में एक सूचक देना था, न कि आपके सभी कोड लिखने के लिए! –

+0

@EpsilonVector इसे इसके बजाय एक धाराप्रवाह इंटरफ़ेस बनाने पर विचार करें, इसलिए: 'stepFunction()। नक्शा (फ़ंक्शन)। मैप (फ़ंक्शन)। टेक (5) 'या जो भी –

1

जावा में, आप हमेशा कक्षा प्रोटोकॉल के साथ ऐसा करते हैं। java.lang.Thread और कैनोलिक उदाहरण के लिए रन फ़ंक्शन देखें। जावा में कोई 'फ़ंक्शन पॉइंटर्स' या 'फ़ंक्शन वेरिएबल्स' नहीं हैं।

-1
public static <T> void apply(final List<T> list, final Function<T> func) 
{ 
    for(final T val : list) 
    { 
     func.perform(val); 
    } 
} 

interface Function<T> 
{ 
    void apply(T value); 
} 

class DisplayFunction<T> 
    implements Function<T> 
{ 
    public void perform(T value) 
    { 
     System.out.println(value); 
    } 
} 

कॉल लागू (सूची, नया प्रदर्शन फ़ंक्शन());

+0

और बिना किसी कारण के यादृच्छिक डाउनमार्किंग अभी भी स्पष्ट रूप से होती है। अगर आपको लगता है कि कुछ गलत है तो यह समझाने के लिए विनम्र है कि आप ऐसा क्यों सोचते हैं। – TofuBeer

+0

ऐसा इसलिए हो सकता है क्योंकि यह सवाल का जवाब नहीं देता है, जिसने पूछा कि दो कार्यों को कैसे लिखें, न केवल एक का उपयोग करके मानचित्र बनाएं। साथ ही, फ़ंक्शन वास्तव में उनके इनपुट को संशोधित नहीं करते हैं, वे एक अलग रूपांतरित मूल्य लौटाते हैं। –

+0

आप इसे सार्वजनिक स्थिर आर लागू कर सकते हैं (अंतिम सूची सूची, अंतिम फ़ंक्शन func) इसे एक अलग मान वापस करने के लिए (या रिटर्न मान के लिए टी का उपयोग करें यदि वापसी मूल्य समान होगा)।आम तौर पर मैं सीधे होमवर्क का जवाब नहीं दूंगा ... लेकिन यह जवाब चीजों को शुरू करने के लिए पर्याप्त होना चाहिए। – TofuBeer

5

Google CollectionsFunction प्रकार, Functions.compose(Function, Function) विधि, Iterables.transform(Iterable, Function) विधि, और भी बहुत कुछ है।

यह आपके लिए उपयोगी नहीं है अगर यह होमवर्क के लिए है (मैं वास्तव में चाहता हूं कि जब कोई प्रश्न गृहकार्य से संबंधित हो, तो सभी लोग इसका खुलासा करेंगे)।

+0

यह होमवर्क संबंधित है। – EpsilonVector

0

FWIW, जावा में समकक्ष "फ़ंक्शन पॉइंटर" एक विधि के साथ इंटरफ़ेस है। आप कुछ वर्ग के साथ इंटरफ़ेस को कार्यान्वित करते हैं, जो विधि के कार्यान्वयन को प्रदान करता है, और उसके बाद उस क्लास ऑब्जेक्ट का संदर्भ संग्रहीत करता है।

किसी अन्य वर्ग ऑब्जेक्ट के संदर्भ को बदलना, जो विधि को अलग-अलग लागू करता है, फ़ंक्शन पॉइंटर को एक अलग फ़ंक्शन पर इंगित करने के बराबर है।

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