2015-04-28 18 views
11

के साथ नेस्टेड लूप के लिए जावा लैम्ब्डा अभिव्यक्ति मैं लैम्ब्डा अभिव्यक्तियों के लिए नया हूं और निम्नलिखित कोड को लैम्ब्डा समकक्ष को कम करने के लिए उनका उपयोग करने की कोशिश कर रहा हूं। मैंने कम और फ्लैटमैप और साथ ही साथ कई अन्य चीजों को देखा है, लेकिन मुझे स्पष्ट रूप से कुछ याद आ रहा है क्योंकि जो भी मैं कोशिश करता हूं वह या तो वाक्य रचनात्मक रूप से गलत है या मेरे पास जो चाहिए वह मेरा संदर्भ नहीं है।सशर्त

मुझे संग्रह में अन्य सभी तत्वों के खिलाफ प्रत्येक तत्व का विश्लेषण करने की आवश्यकता है। मैंने कोड किया कि एक सशर्त के साथ नेस्टेड loops के रूप में। एक बार गैर-मेल खाने वाले तत्वों की पहचान हो जाने के बाद, दोनों तत्वों का उपयोग करके गणना की जाती है। अंत में, मैं प्रत्येक तुलनात्मक गणना के लिए परिणामों का संग्रह चाहता हूं।

तो, यहाँ मूल कोड है:

final List<Element> updated = new ArrayList<>(elements.size()); 

for (final Element first : elements) { 
    Attribute newAttribute = first.getAttribute(); 

    for (final Element second : elements) { 
     if (!first.equals(second)) { 
      newAttribute = newAttribute.add(computeChange(first, second)); 
     } 
    } 
    final Element newElement = new Element(first.getEntry(), newAttribute, first.getValue()); 
    updated.add(newElement); 
} 

फिर, मैं लैम्ब्डा भाव, जिनमें से सबसे सरल है के कई रूपों की कोशिश की:

elements.parallelStream() 
     .map(first -> new Element(first.getEntry(), first.getAttribute().add(
     computeChange(first, second)), first 
     .getValue())).collect(Collectors.toList())); 

जाहिर है, यह गलत है क्योंकि वहां कोई मेरे लिए उपलब्ध दूसरे के संदर्भ और दूसरी स्थिति के लिए कोई शर्त/फ़िल्टर नहीं है।

मैं इस नेस्टेड लूप को लैंडडा अभिव्यक्ति में संग्रह को सशर्त लौटने के साथ कैसे कम करूं?

यहां कोई भी सहायता की सराहना की जाती है।

+3

यह कठिन है क्योंकि आपके 'newAttribute = newAttribute.add (...)' अपडेट नहीं चलाने योग्य हैं। यह आसान होगा यदि आप सभी 'computeChange' परिणामों को एकत्र कर सकते हैं और फिर उस योग से' विशेषता '(या' एलिमेंट') बना सकते हैं। –

+0

मैं इसे छोड़ दूंगा जैसा कि यह है। –

+0

'गणना करें' वापसी क्या करती है? एक 'तत्व', 'विशेषता', या एक संख्या? –

उत्तर

3

प्रयास करें:

elements.stream() 
    .map(first -> { 
     Attribute newAttribute = elements.stream().filter(second -> !first.equals(second)) 
       .map(second -> computeChange(first, second)) 
       .reduce(first.getAttribute(), (a, b) -> a.add(b)) 
       return new Element(first.getEntry(), newAttribute, first.getValue()); 
      }).collect(Collectors.toList())); 
+4

मुझे यह नहीं लगता है .foreach (newAttribute :: add); 'काम करेगा, क्योंकि' add' एक नई विशेषता बनाने लगता है। हो सकता है कि 'कम करें' काम करेगा, यद्यपि। –

+0

@tobias_k foreach त्रुटि की रिपोर्ट करता है: विधि foreach (विशेषता :: जोड़ें) स्ट्रीम प्रकार के लिए अपरिभाषित है। कम करने का उपयोग त्रुटि को समाप्त करता है। – Todd

+0

pgerstoft, @tobias_k मुझे foreach के तर्क को बदलने/विशेषता होने के लिए कम करने की आवश्यकता है: अन्यथा जोड़ें मुझे त्रुटि मिली "प्रकार विशेषता जोड़ (विशेषता, विशेषता) को परिभाषित नहीं करती है जो यहां लागू है"। हालांकि, मैं इकाई परीक्षण पास नहीं कर रहा हूं, इसलिए मुझे नहीं लगता कि बार-बार अपडेट/एड ठीक से काम कर रहा है। मैं इस पर पोकिंग रखने जा रहा हूं, लेकिन अगर आपके पास कोई सुझाव है, तो मुझे उन्हें सुनना अच्छा लगेगा। – Todd