2017-10-04 14 views
10

स्ट्रीम को आलसी कैसे बनाया जा सकता है? संग्रह के आधार कोड के प्रवास के दौरान मैं इस पैटर्न में कई बार चलाने:स्ट्रीम को आलसी बनाएं

Collection collection = veryExpensiveCollectionCreation(); 
return Stream.concat(firstStream, collection.stream()); 

जिसके परिणामस्वरूप श्रेणीबद्ध धारा आम तौर पर, lazily संसाधित किया जाता है के रूप में हम जानते हैं। इसलिए समेकित धारा के पहले भाग में धारा प्रसंस्करण बंद होने पर महंगा संग्रह की आवश्यकता नहीं है।

तो प्रदर्शन कारणों से मैं पूरे संग्रह के निर्माण को स्थगित करना चाहता हूं जब तक कि संगत धारा वास्तव में संयोग के दूसरे भाग के तत्वों को पुन: सक्रिय करने की कोशिश न करे।

छद्म कोड की तरह

return Stream.concat(firstStream, new LazyStreamProvider() { 
    Stream<Something> createStream() { 
     return veryExpensiveCollectionCreation().stream(); 
    } 
); 

संपादित दिखेगा: मैं पुनर्रचना धाराओं को संग्रह निर्माण की सबसे अच्छा होगा, एपीआई के सभी जागरूक स्ट्रीम बनाने के लिए जागरूक कर रहा हूँ। हालांकि, यह इस मामले में एक गैर संशोधित एपीआई के साथ एक और घटक का हिस्सा है।

+1

आप 'veryExpensiveCollectionCreation (के शरीर को संशोधित कर सकते हैं' बस या यह ओवरलोड एक वापस जाने के लिए 'Stream'? – Mena

+2

क्या सख्त संग्रह की बजाय आलसी स्ट्रीम वापस करने के लिए 'बहुत ही सस्ता चयन चयन()' संशोधित किया जा सकता है? – puhlen

उत्तर

13
शायद

नहीं सबसे अच्छा समाधान है, लेकिन आप flatMap विधि में अपने संग्रह का निर्माण कर सकते हैं तो यह lazily का निर्माण किया जाएगा:)

return Stream.concat(
     firstStream, 
     Stream.of(Boolean.TRUE).flatMap(ignoredBoolean -> veryExpensiveCollectionCreation().stream()) 
); 
+2

बस मेरे सिर को मेज पर टक्कर लगी है, क्योंकि यह अब इतना स्पष्ट प्रतीत होता है कि मैंने इसे पढ़ लिया है। – Bananeweizen

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