मैं इस साल छुट्टियों के मौसम में ऊब गया और बेतरतीब ढंग से एक सरल सूची समझ लिखने का फैसला किया/जावा के लिए पुस्तकालय छानने (मैं जानता हूँ कि वहाँ वहाँ कुछ महान लोगों को कर रहे हैं, मैं सिर्फ यह की नरक के लिए अपने स्वयं लिखना चाहते थे) ।स्ट्रिंग अभिव्यक्ति पार्सिंग युक्तियाँ?
इस सूची के लिए:
LinkedList<Person> list = new LinkedList<Person>();
list.add(new Person("Jack", 20));
list.add(new Person("Liz", 58));
list.add(new Person("Bob", 33));
सिंटेक्स है:
Iterable<Person> filtered = Query.from(list).where(
Condition.ensure("Age", Op.GreaterEqual, 21)
.and(Condition.ensure("Age", Op.LessEqual, 50));
मैं अपने बदसूरत पता है, लेकिन अगर मैं स्थिर आयात का उपयोग करें और कम विधि के नाम का उपयोग यह बहुत संक्षिप्त हो जाता है।
Iterable<Person> list2 = Query.from(list).where("x=> x.Age >= 21 & x.Age <= 50");
जाहिर अभिव्यक्ति पार्स मेरी नेस्टेड/एकाधिक सशर्त, पार्स करने के साथ मजबूत क्षेत्र, im होने मुसीबत नहीं है:
निम्न सिंटैक्स अंतिम लक्ष्य है। किसी को कुछ संसाधन/साहित्य के बारे में पता है मुझे मदद मिल सकती है?
मुझे केवल एक सशर्त अभिव्यक्ति मिल रही है जो इस समय स्ट्रिंग लैम्ब्डा सिंटैक्स से सफलतापूर्वक पार्स किया गया है: "x=> x.Name == Jack"
। मेरी अंतर्निहित अभिव्यक्ति संरचना काफी ठोस है और आसानी से किसी भी घोंसले को संभालने में सक्षम हो सकती है, यह मुद्दा केवल एक स्ट्रिंग से पार्सिंग अभिव्यक्ति है।
धन्यवाद
बस किक के लिए है, तो यहां पर्दे के पीछे अभिव्यक्ति संरचना काम कर सकते हैं के रूप में एक छोटे से अंतर्दृष्टि (जाहिर है मैं निर्दिष्ट कर सकता है 'op.GreaterEqual', आदि ... निम्न उदाहरण में है, लेकिन मैं प्रदर्शित करने के लिए कि यह कैसे घोंसले की किसी भी राशि के लिए लचीला है) चाहता था:
Condition minAge1 = Condition.ensure("Age", Op.Equal, 20);
Condition minAge2 = Condition.ensure("Age", Op.Greater, 20);
Expression minAge = new Expression(minAge1, Express.Or, minAge2);
Expression maxAge = Condition.ensure("Age", Op.Equal, 50).or(Condition.ensure("Age", Op.Less, 50));
Expression ageExpression = new Expression(minAge, Express.And, maxAge);
Condition randomException = Condition.ensure("Name", Op.Equal, "Liz");
Expression expressionFinal = new Expression(ageExpression, Express.Or, randomException);
'x => x.Age> = 21 और x.Age <= 50" 'मेरे लिए काफी पार्स नहीं है: क्या आप इसे विस्तारित कर सकते हैं? '&' के सामने तीन अभिव्यक्तियां हैं, जो वेनिला एसक्यूएल शैली खंडों से बहुत अलग हैं। – Chii
मैं अपनी उपयोगिता को एक संबंधपरक डेटाबेस तक जोड़ने के लिए प्रदाता लिखना नहीं चाहता, हालांकि यह मजेदार हो सकता है। बिल्कुल आप मुझसे क्या विस्तार करने के लिए कह रहे हैं? – jdc0589
@Chii: मुझे लगता है, "x => x.Age> = 21 और x.Age <= 50" एक अज्ञात फ़ंक्शन के बराबर है जो तर्क x लेता है और अभिव्यक्ति का मूल्यांकन करके सही या गलत देता है '=>' ऑपरेटर। – MAK