2011-09-20 18 views
5

यहाँ, जावा का उपयोग करते समय मैं स्काला के साथ काम कर रहा हूँ। हमने पुस्तकालय में कुछ सामान्य कक्षाएं इकट्ठा करने का निर्णय लिया है जो जावा में लिखे जाएंगे।चिकनी तरीका है? काम ज्यादातर लोगों पर

जावा:

public interface Func<A, R> { 
    public R f(a A); 
} 

public AClass { 
    public <R> ArrayList<R> myMethod(
          Func<String, R> func 
    ) { 
     // ... 
    } 
} 

जावा में उपयोग:

AClass ac = new AClass(); 
ArrayList<String> al = ac.myMethod(
          new Func<String, String> (
           public String f(String s) { 
            return s + "!"; 
           } 
          }) 

ऊपर बिल्कुल नहीं है अब मैं, पुस्तकालय के लिए कुछ छद्म कार्यात्मक प्रोग्रामिंग जोड़ने के निम्नलिखित पर एक नज़र लेने के लिए बाहर निकलना (वास्तव में एक स्केल परिप्रेक्ष्य से, वास्तव में चुनौतीपूर्ण की तरह)। वहाँ कुछ स्केला जादू को बुलाने के लिए स्केला में निम्नलिखित की तरह कुछ करने के लिए सक्षम होने के लिए कोई तरीका है:

var ac = new ACLass 
var al = ac.myMethod(str => str + "!")    // alternative 1 
al = ac.myMethod { case: str:String => str + "!" } // alternative 2 

मैं थोड़ी देर के लिए implicits के साथ चारों ओर गड़बड़ लेकिन चीजों को हल = पी नहीं मिल सका।

+0

आप स्काला में एक एडाप्टर है कि एक लैम्ब्डा में ले जाता है और एक गुमनाम आंतरिक वर्ग में यह mutates पुस्तकालय का उपभोग करने के लिए बनाने की कोशिश की? मुझे यकीन है कि नहीं कर रहा हूँ अगर आप इस मिल जाएगा, हालांकि संकलन समय जेनरिक के साथ काम करने ... – Bringer128

+0

मैंने किया था, लेकिन मैं इसे काम करने के लिए नहीं मिला =) – fickludd

उत्तर

14
अंतर्निहित रूपांतरण के साथ

:

object FuncConversions { 
    implicit def func2function[A,R](fn: (A) => R) = 
    new Func[A,R] { 
     def f(a: A) = fn(a) 
    } 
} 

अपने दायरे में रूपांतरण आयात करने में न भूलें:

import FuncConversions._ 

तुम भी विपरीत रूपांतरण लागू कर सकते हैं।

+1

ओह बकवास, अब मैं समझ गया। मुझे लगता है कि बहुत ही कोड कोशिश कर रहा था लेकिन 'डीईएफ़ च = fn _' बजाय, जो दे दिया साथ:' : 8: त्रुटि: _ विधि का पालन करना चाहिए; func.type' का पालन नहीं कर सकता। धन्यवाद! – fickludd

6

निदर्शनात्मक जवाब पर विस्तार करने के लिए। यहां बताया गया है कि आप अंतर्दृष्टि को समझने के बारे में कैसे जाते हैं। जब प्रकार जांच नहीं करते हैं तो लागू रूपांतरण खेलते हैं। जब ऐसा होता है, तो संकलक उपयोग करने के लिए एक निहित रूपांतरण की खोज करेगा ताकि प्रकार मिलान हो।

थोड़ा अपने उदाहरण की सफाई, आरईपीएल में करने के बाद, संकलक आएगा:

scala> ac.myMethod((s:String) => s + "!") 
<console>:9: error: type mismatch; 
found : String => java.lang.String 
required: Func[java.lang.String,?] 
       ac.myMethod((s:String) => s + "!") 

तो संकलक आपको बताता है कि यह एक (String) => (String) पाया लेकिन एक Func[String, ?] की जरूरत है। इसलिए आप पाया प्रकार और आवश्यक प्रकार के बीच एक अंतर्निहित रूपांतरण प्रदान करना चाहते हैं। तो हस्ताक्षर की तरह कुछ होना चाहिए: फिर

implicit def fun2Func(fun: (String) => String): Func[String,String] 

, अगले कदम को एहसास है कि निहित रूपांतरण टाइप ए और आर

एक sidenote पर साथ सामान्यीकृत किया जा सकता है, मुझे आश्चर्य है कि अगर आप चाहते http://code.google.com/p/guava-libraries/ जैसे शेल्फ के कुछ उपयोग करके बेहतर हो।

+0

+1 उगाए गए 'Func' के बजाय अमरूद का उपयोग करने के लिए +1।किसी दिन वे जेडीके का हिस्सा बन जाएंगे :) –

+0

मेरे प्रयास किए गए कार्यान्वयन को छोड़कर मेरे बारे में मान्य सलाह। अमरूद निश्चित रूप से एक अच्छा विकल्प है! जब मैं लाइब्रेरी पर खर्च करने के लिए और अधिक समय लेता हूं तो मैं इसे देख लूंगा। – fickludd

3

मैं नहीं जानता कि वास्तव में लेकिन शायद कार्यात्मक जावा http://functionaljava.org/ आप और आपके सहकर्मियों मदद कर सकता है। क्या आप वास्तव में अपने 'छद्म-एफपी' lib में इकट्ठा करने का प्रयास करते हैं?

+0

हमारी लाइब्रेरी कार्यात्मक प्रोग्रामिंग पर केंद्रित नहीं है, मुझे लौटने से पहले संसाधनों को साफ करने में सक्षम होने के लिए कुछ डेटाबेस इंटरैक्शन सामग्री करते समय केवल तर्कों के रूप में कार्य करने की आवश्यकता होती है। जावा के साथ यह क्या है, मुझे लगता है कि कार्यात्मक प्रोग्रामिंग लाइब्रेरी में कम से कम होगी। – fickludd

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