2017-01-19 10 views
56

जावा मेंकक्षा में नए तरीके जोड़े गए हैं।जावा 8 Boolean.logicalOr विधि

सिर्फ बात के बारे में उन्हें

public static boolean Boolean.logicalOr(boolean a , boolean b)

अब से एक है, मेरे सवाल है, क्यों वे की जरूरत थी हैं?

निम्नलिखित दो मामलों के बीच क्या अंतर है।

boolean result = a || b; या Boolean result = Boolean.logicalOr(a,b);

क्या ऐसी क्या खास बात है के बारे में Boolean.logicalOr() और जब मैं एक दूसरे के ऊपर प्राथमिकता देनी चाहिए।

+14

जावडोक क्या कहता है? क्या इसमें एक '@ देखें' संदर्भ है जो सहायक हो सकता है? –

+4

कार्यात्मक रूप से, वे समान हैं, लेकिन कृपया अपने कोड में 'Boolean.logicalOr (ए, बी)' न लिखें। जब आपके पास कोड लिखने के लिए कई, कार्यात्मक रूप से समान तरीके हैं, तो आपको हमेशा सबसे अधिक पठनीय चुनना चाहिए। – VGR

उत्तर

77

मुख्य रूप से उन विधियों में आपकी सुविधा के लिए हैं और कोड को लैम्बडास/स्ट्रीम में विधि संदर्भों का उपयोग करके अधिक पठनीय बनाने के लिए हैं। एक उदाहरण पर नजर डालते हैं:, सही

Stream.of(...) 
     .map(...) 
     .reduce((a, b) -> a || b); // logicalOr is actually using || 

जो पढ़ने योग्य नहीं:

Stream.of(/* .. some objects .. */) 
     .map(/* some function that returns a boolean */) 
     .reduce(Boolean::logicalOr); 

a || b के साथ इस लिखने की कोशिश कर?

जैसा कि सॉटिरियोस डेलिमैनोलिस ने टिप्पणी में कहा था, आप जावाडोक पर भी देखना चाहेंगे और @see BinaryOperator का पालन करना चाहेंगे। या function package summary javadoc पर एक नज़र डालें।

+1

'| 'तर्क भी हो सकता है या बस शॉर्ट-सर्किटिंग नहीं हो सकता है। – shmosel

+0

ठीक है ... टिप्पणी में जोड़ा गया है कि 'logicalOr' वास्तव में '||' – Roland

+1

का उपयोग कर रहा है मुझे लगता है कि यह स्पष्ट है। यद्यपि वास्तव में कोई तर्क नहीं है क्योंकि यह सीधे अपने तर्कों पर चल रहा है। – shmosel

52

इसे विधि संदर्भों के साथ करना है। इस तरह आप lambdas में || (लॉजिकल या) ऑपरेटर का भी उपयोग कर सकते हैं।

वहाँ इस तरह से भी Objects.isNull आदि

समारोह संदर्भ के बजाय (a,b) -> a || b की तरह एक लैम्ब्डा अभिव्यक्ति का उपयोग करते हुए जैसे अन्य नए कार्यों में नदियों और लैम्ब्डा 'देखो और अनुभव' के साथ लाइन में अधिक है।
इसके अलावा, एक विधि संदर्भ कम बाइट कोड उत्पन्न करेगा, और इस प्रकार तेज़ निष्पादन समय (कम से कम थोड़ा) का मतलब होगा।

+1

'BiConsumer' कोई मान वापस नहीं करता है। आप [दस्तावेज़ीकरण] (https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#logicalOr-boolean-boolean-) में 'बाइनरीऑपरेटर' का उपयोग क्यों नहीं करते हैं? – shmosel

+1

अब 10 महीने के लिए जावा दुनिया से बाहर हो गया है ;-) मैं इसे बिना किसी कोड के छोड़ दूंगा। – Sebastian

+18

यह ध्यान देने योग्य हो सकता है कि यह एक विधि कॉल है, इसलिए आप '||' के शॉर्ट-सर्किट व्यवहार को खो देते हैं। – Kevin

3

निम्नलिखित दो मामलों के बीच क्या अंतर है।
बूलियन परिणाम = ए || ख; या बूलियन परिणाम = Boolean.logicalOr (ए, बी);

मैं यहाँ उपरोक्त प्रश्न के बारे में मेरे अंक डाल करने के लिए करना चाहते हैं। यहाँ Boolean.logicalOr

public static boolean logicalOr(boolean paramBoolean1, boolean paramBoolean2) 
    { 
    return (paramBoolean1) || (paramBoolean2); 
    } 

के शरीर तो हम देख सकते हैं कि यह a || b अंततः कर रहा है है। लेकिन जब हम || के बजाय Boolean.logicalOr का उपयोग करते हैं तो यह गैर शॉर्ट सर्किट बन जाता है। क्योंकि यह (Boolean.logicalOr) (a || b) के रूप में माना जाएगा जो a || b से अलग है जब यह कुछ अन्य लॉजिकल ऑपरेटरों के साथ आता है।
उदाहरण-: कृपया नीचे दिए गए कोड का स्निपेट देखें ...

bCheck1 bCheck2 bCheck3 checkOR-Result checkLogicalOr-Result 
true true true true   true 
true true false true   true 
true false true true   true 
true false false false   false 
false true true true   false 
false true false false   false 
false false true true   false 
false false true true   false 

हम इसे अलग परिणाम का उत्पादन कर रहा है जब भी यह अन्य तार्किक ऑपरेटर के साथ प्रयोग किया गया है देख सकते हैं:

public static void main(String[] args) { 

    boolean bCheck1 = false, bCheck2 = true, bCheck3 = false; 
    System.out.println("bCheck1\t" + "bCheck2\t" + "bCheck3\t" + "checkOR-Result\t" + "checkLogicalOr-Result"); 

    bCheck1 = true; bCheck2 = true; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = true; bCheck2 = true; bCheck3 = false; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = true; bCheck2 = false; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = true; bCheck2 = false; bCheck3 = false; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = true; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = true; bCheck3 = false; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = false; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = false; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
} 

private static boolean checkOR(boolean bCheck1, boolean bCheck2, boolean bCheck3){ 
    return bCheck1 && bCheck2 || bCheck3; 
} 

private static boolean checkLogicalOr(boolean bCheck1, boolean bCheck2, boolean bCheck3){ 
    return bCheck1 && Boolean.logicalOr(bCheck2, bCheck3); 
} 

नीचे परिणामों कर रहे हैं। इसलिए ||Boolean.logicalOr या इसके विपरीत उपयोग करने के बारे में सावधान रहने की आवश्यकता है। जाहिर है Boolean.logicalOr|| से अधिक पठनीय है। लेकिन प्रत्येक व्यक्ति का अपना महत्व है और इसका उपयोग नीचे के रूप में किया जा सकता है।
if(bCheck1 && bCheck2 || bCheck3) को if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3))
द्वारा प्रतिस्थापित नहीं किया जा सकता है हालांकि if(bCheck1 && (bCheck2 || bCheck3)) से if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3)) को प्रतिस्थापित करना निश्चित रूप से एक अच्छा विचार होगा।

+0

सशर्त ऑपरेटर बाएं से दाएं निष्पादित किए हैं लेकिन यदि "()" मौजूद है तो पहले प्राथमिकता लेंगी। इसलिए, आपके कोड का आउटपुट बिल्कुल सही है लेकिन यह उपरोक्त प्रश्न से संबंधित नहीं है। Http://introcs.cs.princeton.edu/java/11precedence/ को स्पष्ट करने के लिए कृपया इस आलेख को पढ़ें। माचिन कभी भी गलत आउटपुट नहीं देगा :) – Joy

+0

@ जॉय मैं ऑपरेटरों की प्राथमिकता को समझता हूं। मैंने ** के लिए अपना जवाब दिया है। Boolean.logicalOr() के बारे में इतना खास क्या है और मुझे एक दूसरे को कब पसंद करना चाहिए। ** और ** निम्नलिखित दो मामलों के बीच क्या अंतर है। **। मैंने इस नौसिखिया को किसी भी नौसिखिया पर विचार करने के लिए बहुत सरल उदाहरण दिया है जो अभी तक प्राथमिकता को समझ में नहीं आता है। यह अनुभवी के लिए व्यर्थ हो सकता है लेकिन यह निश्चित रूप से किसी नौसिखिया की मदद करने जा रहा है। –