2014-10-10 7 views
36

मैं निम्नलिखित कोड parallelize करना चाहते हैं एक parallelStream का उपयोग कर कतरना:बुलियन मूल्यों का स्ट्रीम, क्या कोई सच है?

boolean anyTrue() { 
    for (Element e : setOfE) { 
    if (eval(e)) { 
     return true; 
    } 
    } 
    return false; 
} 

समानांतर धाराओं पर निम्नलिखित काम करते हैं और नियमित रूप से शॉर्ट सर्किट के मूल्यांकन का उपयोग करेंगे?

setOfE.parallelStream().map(e -> eval(e)).reduce(false, (a,b) -> a || b)) 

उत्तर

76

स्ट्रीम एपीआई वास्तव में आपकी आवश्यकता के लिए प्रथम श्रेणी के समर्थन हासिल है:

setOfE.parallelStream().anyMatch(e->eval(e)); 

रूप reduce के साथ अपने दृष्टिकोण का विरोध करने के लिए इस,

वैकल्पिक रूप से आप के रूप में मार्को Topolnik की टिप्पणी ने सुझाव दिया उपयोग कर सकते हैं शॉर्ट-सर्किट मूल्यांकन और समानांतर लाभ समानांतरता की गारंटी है।

12

नहीं, कमी शॉर्ट-सर्किट मूल्यांकन का समर्थन नहीं करती है। इसका कारण यह है कि reduce को केवल मनमाना BinaryOperator कार्यान्वयन प्राप्त होता है और विशेष ऑपरेशन को कम-सर्किट करने की संभावनाओं के बारे में कोई जानकारी नहीं है।

लेकिन आप पूरे आपरेशन बहुत सरल कर सकते हैं:

setOfE.parallelStream().filter(e -> eval(e)).findAny().isPresent() 

यह केवल एक मनमाना आइटम जिसके लिए eval रिटर्न true और findAny जैसे ही एक धागा एक मैच का सामना किया है आपरेशन समाप्त करने के लिए अनुमति देता है के लिए खोज करता है। परिणामी Optional खाली होने के लिए पूछताछ की जा सकती है क्योंकि आप विशेष मिलान Element में रुचि नहीं रखते हैं।

setOfE.parallelStream().anyMatch(e -> eval(e)) 
संबंधित मुद्दे