2011-11-18 16 views
7

मेरे पास एक जावा क्लास है जिसके पास एक लेनदेन संदर्भ तक पहुंच है जिसे मैं स्कैला से उपयोग करना चाहता हूं। तो मैंने सोचा कि कि मैं एक जावा विधि है कि एक स्काला समारोह लेता है और लेन-देन के अंदर यह कॉल लिखना चाहते हैं - अब तक तो अच्छाक्या स्कैला में एक लैम्ब्डा कार्य है?

class Context { 
    @Transactional public void runInTx(Function0<scala.Unit> f) { 
     f.apply(); 
    } 

। मैं इसे

def deleteItems(ids: Set[Long]) = { 
    context.runInTx { ids foreach { dao.delete(_) } } 
} 

करने के लिए एक स्काला बंद पारित करने में सक्षम होना चाहते हैं, लेकिन इसलिए नहीं कि runInTx वास्तव में नाम से बुलाते नहीं है सकते हैं, और ids foreach { dao.delete(_) } वास्तव में एक Function0 नहीं है।

अब मैं एक छोटे से thunk

def deleteItems(ids: Set[Long]) = { 
    def localApply(f: => Unit) = context.applyInTx(f _) 
    localApply { ids foreach { dao.delete(_) } } 
} 

के साथ इस समस्या का समाधान कर सकते हैं, लेकिन यह मेरे लिए है कि मैं एक लैम्ब्डा समारोह की जरूरत है एक अनाम Function0 एक कोड ब्लॉक से बाहर का उत्पादन हो रहा है।

क्या ऐसी चीज एपीआई में मौजूद है, या मैं इसे लिखने के बारे में कैसे जाऊं?

उत्तर

11

आप संकलक को ब्लॉक (इस मामले में कमी) पैरामीटर जोड़कर तत्काल बुलाए जाने वाले बयान के बजाय ब्लॉक के रूप में व्याख्या करने के लिए कह सकते हैं।

तो इस मामले में:

def deleteItems(ids: Set[Long]) = { 
    context.runInTx {() => ids foreach { dao.delete(_) } } 
} 

() => ids foreach { dao.delete(_) } समारोह शाब्दिक से भरा रूप है। कंपाइलर पैरामीटर सूची को उन स्थानों पर छोड़ा जा सकता है जहां यह अनुमान लगाया जा सकता है कि फ़ंक्शन की आवश्यकता है - यह नाम से कॉल के लिए सच है, लेकिन Function

लेने वाली विधि से गुज़रने पर यह सच नहीं लगता है
संबंधित मुद्दे