2015-03-25 4 views
5

stream एपीआई का उपयोग करके नेस्टेड फोरैच लूप के साथ कैलकुलेट किया जा सकता है जहां प्रत्येक में फ़िल्टर की स्थिति होती है?नेस्टेड फ़ोरैच लूप के भीतर मूल्यों को कैसे समेटें?

//java7 
Double sum = null; 
for (FirstNode first : response.getFirstNodes()) { 
    if (first.isValid()) { 
     for (SndNnode snd : first.getSndNodes()) { 
      if (snd.getType() == NodeType.AMOUNT) { 
       sum += snd.getAmount(); 
       break; 
      } 
     } 
    } 
} 

//java8 
response.getFirstNodes().stream().filter(first -> first.isValid()).mapToDouble(???).sum(); 

मेरे SND foreach पाश होगा:

first.getSndNodes().stream().filter(snd -> snd.getType() == NodeType.AMOUNT).mapToDouble(snd -> snd.getAmount()).findFirst().sum(); 

कैसे मैं अब पहले में SND foreach पाश को एकीकृत कर सकता है, नेस्टेड सूचियों का एक वैश्विक राशि प्राप्त करने के लिए?

response.getFirstNodes() 
     .stream() 
     .filter (first -> first.isValid()) 
     .flatMap (first -> first.getSndNodes().stream()) 
     .filter(snd -> snd.getType() == NodeType.AMOUNT) 
     .mapToDouble(snd -> snd.getAmount()) 
     .sum(); 
+0

मुझे लगता है कि 'ब्रेक;' कथन अनावश्यक है –

+0

यदि नहीं मिलता है 'getSndNodes()' वास्तव में बड़ी सूची देता है और मैं केवल पहला/केवल परिणाम प्राप्त करना चाहता हूं। लेकिन निश्चित रूप से यह वास्तव में केवल बहुत बड़ी सूचियों पर लागू होता है, और अधिकांश समय का कोई प्रभाव नहीं पड़ेगा। – membersound

उत्तर

8

आप इस्तेमाल कर सकते हैं flatMap:

+0

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

+2

ठीक है लेकिन फिर आपका दूसरा अनुवाद प्रत्येक मूल कोड जैसा नहीं है क्योंकि यह प्रत्येक कोड के सभी मानों को समेटेगा जो मूल कोड में पहले व्यक्ति की बजाय AMOUNT हैं। –

+0

ओह धन्यवाद, मैंने इसे स्पष्ट करने के लिए अब मेरी पोस्ट में 'findFirst() 'जोड़ा। – membersound

2

आप सभी आंतरिक सूचियों में से एक भी स्ट्रीम बनाने के लिए उपयोग कर सकते हैं flatMap

response.getFirstNodes() 
     .stream() 
     .filter(first -> first.isValid()) 
     .flatMap(first -> first.getSndNodes().stream()) 
     .filter(snd -> snd.getType() == NodeType.AMOUNT) 
     .mapToDouble(snd -> snd.getAmount()) 
     .sum(); 

मुझे यकीन है कि चाहे वह break; में जानबूझकर है नहीं कर रहा हूँ अपने मूल कोड


break; बयान के साथ, यह होना चाहिए इस तरह दिखता है:

response.getFirstNodes() 
       .stream() 
       .filter(first -> first.isValid()) 
       .map(first -> first.getSndNodes().stream().filter(snd -> snd.getType() == NodeType.AMOUNT).findFirst()) 
       .filter(Optional::isPresent) 
       .mapToDouble(opt -> opt.get().getAmount()) 
       .sum(); 

मूल रूप से, प्रत्येक FirstNode आप परीक्षण है कि क्या यह वैध है के लिए है, तो आप अपने SndNode रों की एक धारा के लिए प्रत्येक FirstNode नक्शा जिसके लिए आप पहले पाते हैं जिसमें NodeType.AMOUNT है। आपको केवल उन विकल्पों को प्राप्त करने के लिए फ़िल्टर करने की आवश्यकता है जो खाली नहीं हैं और उनके लिए आपको SndNode मिलते हैं, जिसके लिए आपको संबंधित राशि मिलती है।

2

आप .flatMap() नेस्टेड नोड्स का उपयोग कर सकते हैं। उदाहरण के लिए:

response.getFirstNodes().stream() 
         .filter(FirstNode::isValid) 
         .flatMap(first -> first.getSndNodes().stream()) 
         .filter(snd -> snd.getType == NodeType.AMOUNT) 
         .mapToDouble(SndNode::getAmount) 
         .sum(); 
4

आपका प्रयास सही समाधान

response.getFirstNodes().stream() 
.filter(FirstNode::isValid) 
.mapToDouble(first -> 
    first.getSndNodes().stream() 
     .filter(snd -> snd.getType() == NodeType.AMOUNT) 
     .mapToDouble(snd -> snd.getAmount()) 
     .findAny().orElse(0)) 
.sum(); 

क्या आप वाकई भीतरी धारा, आप findAny उपयोग कर सकते हैं में अधिकतम एक मैच वहाँ के रूप में वहाँ कोई आवश्यकता नहीं है है कि कर रहे हैं के करीब है फिर आदेश पर। मैंने 0 के साथ इसे प्रतिस्थापित करके एक मैच की संभावित अनुपस्थिति से निपटने के लिए सबसे सरल समाधान का उपयोग किया जो sum से पारदर्शी है और हमें अतिरिक्त फ़िल्टरिंग से बचाता है।

+1

यह भी अच्छा है ... +1 –

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