2014-05-08 14 views
5

स्ट्रिंग्स की सूची निम्नलिखित को देखते हुए:बग। भविष्य में?

List<String> progLangs = Arrays.asList("c#", "java", "python", "scala"); 

और एक regex पैटर्न है कि 4 अक्षर लोअरकेस स्ट्रिंग से मेल खाना चाहिए।

Pattern p = Pattern.compile("[a-z]{4}"); 

अब मैं progLangs के तत्वों कि पैटर्न p को फिट खोजने के लिए चाहते हैं।

for (String lang : progLangs) { 
    if (p.matcher(lang).matches()) { 
     System.out.println(lang); 
    } 
} 

मैं उम्मीद परिणाम प्राप्त:

यह पुराना तरीका कर

java 

लेकिन जब मैं जावा 8 धारा के साथ एक ही प्राप्त करने और का उपयोग कर एक विधेय के पैटर्न को बदलने के लिए कोशिश Pattern.asPredicate:

progLangs.stream() 
    .filter(p.asPredicate()) 
    .forEach(System.out::println); 

परिणाम है:

java 
python 
scala 

ऐसा क्यों है? ऐसा लगता है कि Patter.asPredicate एक अनुमान उत्पन्न करता है जो आंशिक मिलान स्वीकार करता है। पैटर्न एपीआई में समतुल्य क्या है? documentation केवल कहता है:

एक अनुमान बनाता है जिसका उपयोग स्ट्रिंग से मेल खाने के लिए किया जा सकता है।

मैं अपेक्षा करता हूं कि यह सामान्य Pattern.matcher(String).matches() हो लेकिन यह कुछ और है ... इस असंगतता को कैसे समझाया जाए?

उत्तर

7

वे एक ही काम नहीं कर रहे हैं - भविष्यवाणी find rather than matches का उपयोग करती है। बराबर 'पुराने कोड' तरीका होगा:

for (String lang : progLangs) { 
    if (p.matcher(lang).find()) { 
     System.out.println(lang); 
    } 
} 

इस मामले में मैं अपने ही विधेय का प्रयोग करेंगे:

progLangs.stream() 
    .filter(s -> p.matcher(s).matches()) 
    .forEach(System.out::println); 

प्रलेखन हालांकि भ्रामक प्रतीत होता है।

+0

ऐसा लगता है कि आप सही हैं। हालांकि, मैं अभी भी समझ नहीं पा रहा हूं कि उन्होंने इसे इस तरह क्यों लागू किया। क्या वास्तव में Matcher.find() का उपयोग Matcher.matches() से अधिक आम है? –

+0

मैं नहीं कह सकता था, शायद मुझे कुछ याद आ रहा है। – Jonathan

+6

@LukaszWiktor वास्तव में 'ढूंढ' या 'मैच' चुनना महत्वपूर्ण नहीं है क्योंकि हम रेगेक्स लिख सकते हैं जो 'केस' जैसे 'ढूंढ' को '^ 'और' $ 'के साथ अपने मामले में जोड़कर' ढूंढ' कर सकता है। [एजी] {4} $ ', या 'मिलान' जैसे 'ढूंढें' (आसपास के आह्वान) को आसपास के रेगेक्स द्वारा'। * '' * * serchedPattern। * 'के साथ करें। हो सकता है कि 'ढूंढें' चुना गया है क्योंकि यह तेज़ है, क्योंकि यह '। * Regex। *' के मामले में पूरी स्ट्रिंग पर फिर से शुरू करने के बजाय पहले मिलान करने वाले substirng को खोजने के बाद पुनरावृत्ति करना बंद कर देगा। – Pshemo

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