2009-07-26 12 views
60

जावा के समकक्ष Func और Action के समकक्ष क्या हैं?जावा के समकक्ष फनक और एक्शन

मेरा मतलब है, बजाय अपने दम पर इस लेखन की:

public interface Func<TInput, TResult> 
{ 
    TResult call(TInput target) throws Exception; 
} 
public interface Action<T> 
{ 
    void call(T target) throws Exception; 
} 
+0

यह भी देखें http://stackoverflow.com/questions/7296606/what-is-the-closes टी-चीज-जावा-टू-द-नेट-फंक-एंड-एक्शन-प्रतिनिधि – nawfal

उत्तर

3

वास्तव में उन लोगों के लिए कोई समकक्ष हैं। आप जावा में अज्ञात भीतरी कक्षाएं बना सकते हैं, लेकिन फ़नक और एक्शन जैसे सामान्य जेनेरिक के बजाय विशिष्ट इंटरफेस होते हैं।

3

जावा में प्रतिनिधियों की अवधारणा नहीं है। एक समाधान के दृष्टिकोण के लिए, कृपया A Java Programmer Looks at C# Delegates देखें: सी # क्षमताओं जावा के समान का एक सेट है

है, यह कई नए और दिलचस्प सुविधाओं को जोड़ा गया है। प्रतिनिधिमंडल विधि को प्रथम श्रेणी के ऑब्जेक्ट के रूप में इलाज करने की क्षमता है। एक सी # प्रतिनिधि का उपयोग किया जाता है जहां जावा डेवलपर्स एक विधि के साथ एक इंटरफ़ेस का उपयोग करेगा। इस आलेख में, सी # में प्रतिनिधियों का उपयोग चर्चा की गई है, और कोड जावा प्रतिनिधि ऑब्जेक्ट के लिए प्रस्तुत किया गया है जो समान फ़ंक्शन कर सकता है। यहां स्रोत कोड डाउनलोड करें।

27

Callable इंटरफ़ेस Func के समान है।

Runnable इंटरफ़ेस क्रिया के समान है।

सामान्य रूप से, जावा अज्ञात आंतरिक कक्षाओं का उपयोग सी # प्रतिनिधियों के प्रतिस्थापन के रूप में करता है। उदाहरण के लिए कि यह कैसे आप जीयूआई में बटन प्रेस करने के लिए प्रतिक्रिया करने के लिए कोड जोड़ने है:

button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      ...//code that reacts to the action... 
     } 
}); 
+12

कॉल करने योग्य से फ़ंक को अलग करता है, यह है कि 16 तर्कों के लिए जेनेरिक ओवरलोड हैं (Func , Func , Func , आदि)। ओटीओएच, कॉल करने योग्य कोई तर्क नहीं लेता है। इसके अलावा, जेनिक्स में टाइप एरर के कारण सी # के अधिभार को लागू करना असंभव है। –

5

अतिभारित समारोह प्रतिनिधियों की शान (प्रतिनिधि बनाम गुमनाम वर्ग मुद्दे के अलावा) है कि वे 0 से 16 तर्कों को समर्थन (है Func<TResult>, Func<T, TResult>, Func<T1, T2, TResult>, आदि)

दुर्भाग्य से, जावा में टाइप एरर के कारण यह असंभव है। कक्षाएं सामान्य प्रकार के पैरामीटर अकेले अलग नहीं हो सकती हैं।

जावा 8 अब BiConsumer जैसे Action<T, T2> के नामों के चिड़ियाघर में लाता है और, क्योंकि जावा आदिम प्रकार के तर्कों की अनुमति नहीं देता है, BiIntConsumer। हालांकि, "चिड़ियाघर" बहुत बड़ा नहीं है, और मुझे उस पुस्तकालय से अवगत नहीं है जो इसे फैलाता है। (int, int) => void जैसे फ़ंक्शन प्रकार अक्षर के लिए एक शानदार प्रस्ताव था लेकिन इसे अपनाया नहीं गया था।

+2

दिलचस्प बात यह है कि सीएलआर स्तर की कक्षाओं में जो सामान्य पैरामीटर की संख्या से भिन्न होती है, के अलग-अलग नाम होते हैं। 'Func'1'' आदि। यह सिर्फ सी # है जो उसी नाम के लिए मानचित्र करता है। – CodesInChaos

+0

@CodesInChaos Ahh, बहुत रोचक। बहुत खराब जावा ने इस तरह से ऐसा नहीं किया। बीटीडब्ल्यू, जावा 8 अब 'एक्शन ' के लिए 'BiConsumer' जैसे नामों के चिड़ियाघर में लाता है और, क्योंकि जावा आदिम प्रकार पैरामीटर, 'BiIntConsumer' की अनुमति नहीं देता है। फ़ंक्शन प्रकार के अक्षर जैसे '(int, int) => शून्य 'के लिए एक प्रस्ताव था लेकिन इसे अपनाया नहीं गया था। –

66

जावा 8 में, समकक्ष java.util.function.Function<T, R> और java.util.function.Consumer<T> इंटरफेस क्रमशः हैं। इसी तरह, java.util.function.Predicate<T>System.Predicate<T> के बराबर है। जैसा कि कहीं और बताया गया है, ये प्रतिनिधियों के बजाय इंटरफेस हैं।

तरफ संबंधित: मैं वर्तमान में LINQ की तरह विस्तार विधि चीज़ें करने निम्नलिखित उपयोगिता वर्ग पर भारी झुकाव रहा हूँ:

abstract class IterableUtil { 
    public static <T> Iterable<T> where(Iterable<T> items, Predicate<T> predicate) { 
    ArrayList<T> result = new ArrayList<T>(); 
    for (T item : items) { 
     if (predicate.test(item)) { 
     result.add(item); 
     } 
    } 
    return result; 
    } 

    public static <T, R> Iterable<R> select(Iterable<T> items, Function<T, R> func) { 
    ArrayList<R> result = new ArrayList<R>(); 
    for (T item : items) { 
     result.add(func.apply(item)); 
    } 
    return result; 
    } 
} 

System.Linq.Enumerable.Where<TSource> के विपरीत और System.Linq.Enumerable.Select<TSource, TResult> LINQ की तरह तरीकों मैं यहाँ पेश आलसी नहीं हैं और कॉलर को परिणाम संग्रह वापस करने से पहले स्रोत संग्रह को पूरी तरह से पार करें। फिर भी, मैं उन्हें पूरी तरह से वाक्य रचनात्मक उद्देश्यों के लिए उपयोगी पाते हैं और यदि आवश्यक हो तो आलसी बना दिया जा सकता है।

class Widget { 
    public String name() { /* ... */ } 
} 

एक को देखते हुए निम्न कर सकते हैं:

List<Widget> widgets = /* ... */; 
Iterable<Widget> filteredWidgets = IterableUtil.where(widgets, w -> w.name().startsWith("some-prefix")); 

कौन सा मैं निम्नलिखित करना पसंद करते हैं:

List<Widget> widgets = /* ... */; 
List<Widget> filteredWidgets = new ArrayList<Widget>(); 
for (Widget w : widgets) { 
    if (w.name().startsWith("some-prefix")) { 
    filteredWidgets.add(w); 
    } 
} 
+1

हमें वास्तव में इस जवाब को वोट देने की आवश्यकता है क्योंकि यह प्रश्न "जावा क्रिया के बराबर" के लिए वर्तमान # 1 खोज परिणाम है और अब यह 2015 है, इसलिए जावा 8 सामान जावा की तुलना में बेहतर तरीका है और लगभग नकल करता है। नेट की सामग्री इस बिंदु। –

+1

मुझे लगता है कि आपका मतलब Iterable फ़िल्टर किए गए विजिट्स = IterableUtil.where (विजेट्स, डब्ल्यू -> w.name()। StartWith ("कुछ-उपसर्ग")); – electricalbah

+0

'फंक्शन ' और 'उपभोक्ता ' के अतिरिक्त, आप सामान्य कार्यात्मक इंटरफेस का पूरा सेट पा सकते हैं जो जावा प्रदान करता है [यहां] (https://docs.oracle.com/javase/8/docs/api/java /util/function/package-summary.html)। – ZenLulz

2

लिए Func<T> उपयोग: java.util.function.Supplier http://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html

+0

'प्रदायक' 'Func ' के बराबर होगा ('Func ' के विपरीत) 'action' नहीं। एक 'एक्शन' कोई तर्क स्वीकार नहीं करता है और कोई परिणाम नहीं देता है। ('एक्शन' के अन्य संस्करण विभिन्न तर्कों को स्वीकार करते हैं और कोई परिणाम नहीं देते हैं।) – Servy

+0

हाँ आप सही हैं, मेरी गलती। मैं इस पोस्ट में भाग गया क्योंकि मैं जावा के लिए 'Func ' ढूंढ रहा था और गलती से इसे 'एक्शन ' के रूप में याद किया था। ओह –

+0

उत्तर मेरे लिए भी सहायक था। क्या जावा में 'एक्शन <> ': 0 इनपुट, 0 आउटपुट जैसे कुछ भी हैं। 'andhen (...) 'कार्यक्षमता के साथ सबसे अच्छा। –

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