2014-05-21 5 views
5

में सूची से तत्व को वापस लौटें मेरे पास एक सूची है और मैं सूची से एक तत्व चाहता हूं जो एक अनुमान से मेल खाता है। मुझे सूची से एक तत्व मिल रहा है जो पहली भविष्यवाणी से मेल खाता है, अगर पहली भविष्यवाणी सही नहीं होती है, तो यह दूसरी भविष्यवाणी से मेल खाती है।मेल खाने की भविष्यवाणी करें और iterable.try का उपयोग करें। जावा

Case1:

result = iterable.tryFind(List, Predicates.or(predicate1, predicate2)).orNull(); 

मुद्दा कोड के इस टुकड़े के साथ यह पहला तत्व है जो उन विधेय से मेल खाता पाता है

यहाँ एक उदाहरण है। यहां तक ​​कि यदि सूची में दूसरा तत्व पहले अनुमान से मेल खाता है, जो मेरे मामले में उच्च प्राथमिकता दी जानी चाहिए। इस मामले में, मैं परिणाम को दूसरे तत्व के रूप में यहां उम्मीद कर रहा हूं, लेकिन पहले तत्व प्राप्त करना (क्योंकि यह पहला तत्व है जो उन भविष्यवाणियों में से एक से मेल खाता है)।

Case2:

result = iterable.tryFind(List, Predicates.and(predicate1, predicate2)).orNull(); 

यह स्पष्ट रूप से काम नहीं है, अगर पहले विधेय झूठे रिटर्न होगा।

केस 3:

result = iterable.tryFind(List, predicate1).orNull(); 

if(result == null) 
result = iterable.tryFind(List, predicate2).orNull(); 

यह मेरे लिए काम करेंगे, लेकिन यह गंदा लग रहा है और कार्यात्मक प्रोग्रामिंग का उद्देश्य धरा।

क्या मेरे परिदृश्य के लिए काम करने वाली सूची से तत्व लाने का कोई अन्य तरीका है?

+2

यह वास्तव में उद्देश्य सिर्फ इसलिए कि आप शाखाएं हैं हार है? आपको क्या परेशान कर रहा है: शाखा, डबल पुनरावृत्ति, कुछ और? फ़िल्टरिंग के बजाए मैपिंग करके आप एक ही पुनरावृत्ति के साथ परिणाम प्राप्त कर सकते हैं, इसलिए आप जानते हैं कि कौन सा अनुमान मिलान किया गया है, उन तत्वों को फ़िल्टर करना जो किसी भी पूर्वानुमान से मेल नहीं खाते हैं और फिर मैच से दी गई प्राथमिकता के साथ पहले मैच को बनाए रखने के लिए कम करते हैं पहला भविष्यवाणी क्या यह वास्तव में कम गन्दा होने जा रहा है (जावा में)? –

+0

@ फ्रैंकपावेजौ: शाखाएं मुझे परेशान कर रही हैं। मुझे उम्मीद है कि यह भविष्यवाणियों को अलग किए बिना काम करेगी। जो आप सुझाव दे रहे हैं वह इसी तरह होगा, अगर मैं इसे सही समझ गया। मुझे लगता है कि यह एकमात्र तरीका है जिसे मैं इसे काम कर सकता हूं। – LifeStartsAtHelloWorld

+1

मुझे नहीं लगता कि "कार्यात्मक प्रोग्रामिंग" का मतलब है सभी नियंत्रण प्रवाह को हटा देना: कुछ बिंदु पर इसे कुछ करना है, और जब आप किसी संग्रह को फ़िल्टर करते हैं तो यह विधि में छिपा हुआ है, हटाया नहीं गया है। –

उत्तर

5

आप Predicate.or के बजाय Optional.or उपयोग कर सकते हैं कि आप क्या चाहते प्राप्त करने के लिए:

result = Iterables.tryFind(list, predicate1) 
     .or(Iterables.tryFind(list, predicate2)) 
     .orNull(); 
+2

समस्या यह है कि 'Iterables.tryFind (सूची, predicate2)' हमेशा मूल्यांकन किया जाता है। आपको जावास्क्रिप्ट से '||' या LISP से 'या' की आवश्यकता होगी। जावा में यह केवल तभी काम कर सकता है जब 'tryFind' आलसी था और' वैकल्पिक 'आवश्यक होने पर इसके तर्क का मूल्यांकन करेगा। – maaartinus

+0

यह मेरे समाधान का नुकसान है। आलसी 'tryFind' को' प्रदायक 'के साथ कार्यान्वित किया जा सकता है, लेकिन यह केवल तभी काम करता है जब यह अनुपस्थित नहीं होता है। – phlogratos

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