2017-05-10 17 views
5

मेरे पास एक ऐसा प्रोग्राम है जो कुछ विशेषताओं के लिए टेक्स्ट का विश्लेषण करता है। के रूप में यहाँ देखा webDataField.containsAttributeXYZ();: कोड के बुनियादी ढांचे को ही सभी विशेषताओं के लिए यह केवल एक लाइन में बदलता है इसके बजाय प्रत्येक शर्त के लिए एक ही कोड लिखने (& अपने आप को कोड में दोहरा) कीजावा में भविष्यवाणी 8

for (int index = 0; index < fields.size(); index++) { 
    WebDataField webDataField = fields.get(index); 
    boolean expectedCondition = webDataField.containsAttributeXYZ(); // Varies at this line.. 

    Double score = evaluateBooleanCondition(actualCondition, expectedCondition); 

    WebDataFields fieldName = webDataField.getFieldName(); 
    ... 
} 

मैं था कोड के मुख्य भाग को एक बार लिखना और इस शर्त को शर्त (जो सत्य या गलत का मूल्यांकन करता है) पास करना पसंद है।

मैं Java Predicate पर नया हूं लेकिन अगर मैं सही ढंग से समझता हूं तो यह वास्तव में जावा में भविष्यवाणी का कार्य है।

क्या यह मुझे अपनी स्थिति में प्रत्येक शर्त लिखने के लिए मजबूर करता है और फिर उस वर्ग को Predicate इंटरफ़ेस लागू करने के लिए मजबूर करता है? इस कोड को गुमराह बनने के लिए कारण होगा

class ContainsAttributeXYZ implements Predicate<Boolean> 

और एक बड़ा ट्रिगर किया:

यदि हां, तो समारोह (जो कि पहले एक वर्ग है कि समान कार्य शामिल हैं में घोषित किया जाता है) की तरह कुछ करने के लिए परिवर्तित किया जा करने की आवश्यकता होगी कार्यक्रम में कक्षाओं की संख्या में वृद्धि (जैसे प्रत्येक कार्य को कक्षा में परिवर्तित करने की आवश्यकता होती है)

या क्या मैंने जावा में काम करने के बारे में कुछ गलत समझा है? क्या ऐसा करने का कोई और तरीका है?

धन्यवाद

+0

मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। एक 'भविष्यवाणी' को कक्षा के रूप में घोषित करने की आवश्यकता नहीं है। उदाहरण के लिए, ' पी = (स्ट्रिंग एस) -> एस। लम्बाई()> 5; 'करेंगे। – bradimus

+4

ए 'भविष्यवाणी ' ज्यादा समझ में नहीं आता है। आप शायद 'भविष्यवाणी ' चाहते हैं। –

+0

यह कैसे है कि आपने [लैम्ब्डा] टैग जोड़ा है, और फिर भी स्पष्ट रूप से यह नहीं पता कि वे क्या हैं? – 4castle

उत्तर

5

यहाँ एक उदाहरण विधि है कि एक तर्क के रूप में एक Predicate लेता है:

void processFields(List<WebDataField> fields, Predicate<WebDataField> predicate) { 
    for (WebDataField webDataField : fields) { 
     boolean expectedCondition = predicate.test(webDataField); 
    } 
} 

और आप इस तरह की एक विधि संदर्भ गुजर, द्वारा यह कहेंगे:

processFields(fields, WebDataField::containsAttributeXYZ); 
processFields(fields, WebDataField::containsAttributeABC); 

जहां containsAttributeXYZ और containsAttributeABCWebDataField वर्ग के तरीके हैं जो boolean लौटाते हैं। या आप WebDataField संशोधित किए बिना लैम्ब्डा इनलाइन बना सकते हैं। जैसे :

processFields(fields, w -> w.getFieldName().length() > 5); 

आप एक वर्ग को लागू करने वाली Predicate

1

आप एक Predicate बनाने के लिए एक नया वर्ग बनाने की जरूरत नहीं है बनाने की जरूरत नहीं है। ऐसा इसलिए है क्योंकि जावा 8 ने लैम्ब्डा सिंटैक्स जोड़ा है, जिसे आप केवल एक विधि के साथ एक इंटरफ़ेस को कार्यान्वित करने वाले अज्ञात आंतरिक कक्षाओं के लिए एक शॉर्टंड के रूप में सोच सकते हैं।

Predicate<Boolean> containsXYZ = b -> !b; 

वैकल्पिक रूप से:

अपने विधेय बस एक ही अभिव्यक्ति की परिणाम देता है
Predicate<Boolean> containsXYZ = new Predicate<Boolean>() { 
    public boolean test(Boolean b) { 
     return !b; 
    } 
}; 

है, यह करने के लिए छोटा किया जा सकता:

Predicate<Boolean> containsXYZ = b -> { 
    return !b; 
}; 

इस के बराबर है: यहाँ एक उदाहरण है , एक फ़ंक्शन एक विधि का संदर्भ हो सकता है:

Predicate<Boolean> containsXYZ = MyClass::myMethod; // for static methods, or 
Predicate<Boolean> containsXYZ = this::myMethod; // for instance methods 

यह एक-पंक्ति का अनुमान है जो इनपुट गलत होने पर सत्य लौटाता है, और इसके विपरीत।अब, आपके उपयोग के मामले के लिए, आप कुछ इस तरह देख सकते हैं:

static void checkAttributes(Predicate<WebDataField> containsAttributeXYZ) { 
    for (WebDataField webDataField : fields) { 
     boolean expectedCondition = containsAttributeXYZ.test(webDataField); 
     Double score = evaluateBooleanCondition(actualCondition, expectedCondition); 
     WebDataFields fieldName = webDataField.getFieldName(); 

     ... 
    } 
} 

कैसे lambdas काम का एक विस्तृत विवरण के लिए, Java Tutorial पढ़ें।

+1

यह 'बी ->! बी' लिखने का एक सुंदर वर्बोज़ तरीका है। ब्रेसिज़ और रिटर्न कीवर्ड आवश्यक नहीं हैं। – VGR

+2

@ वीजीआर सहमत हुए, लेकिन मैंने सोचा कि यह मुझे जावा पृष्ठभूमि से किसी के लिए अधिक पठनीय हो सकता है जिसने (जाहिर है) पहले कभी लम्बास नहीं देखा (यानी ओपी)। इस तरह, यह एक तरह की तरह दिखता है। –