मान लीजिए कि मेरे पास चीजों की एक धारा है और मैं उन्हें मध्य धारा में "समृद्ध" करना चाहता हूं, मैं यह करने के peek()
लिए उपयोग कर सकता हूं , जैसे:
streamOfThings.peek(this::thingMutator).forEach(this::someConsumer);
मान लें कि कोड में इस बिंदु पर चीजों को बदलना सही व्यवहार है - उदाहरण के लिए, thingMutator
विधि "lastProcessed" फ़ील्ड को वर्तमान समय में सेट कर सकती है।
हालाँकि, peek()
अधिकांश संदर्भों का अर्थ है "देखो, लेकिन स्पर्श मत करो"।
धारा तत्वों का एक उत्परिवर्ती या गलत सलाह peek()
देने के लिए उपयोग कर रहा है ?
संपादित करें:
उपभोक्ता को बदलने के लिए वैकल्पिक, अधिक पारंपरिक, दृष्टिकोण होगा:
private void thingMutator(Thing thing) {
thing.setLastProcessed(System.currentTimeMillis());
}
एक फ़ंक्शन जो पैरामीटर लौटाता है:
private Thing thingMutator(Thing thing) {
thing.setLastProcessed(currentTimeMillis());
return thing;
}
और map()
इसके बजाय उपयोग करें :
stream.map(this::thingMutator)...
लेकिन वह परफ़ेक्ट्री कोड ( return
) का परिचय देता है और मुझे यकीन नहीं है कि यह स्पष्ट है, क्योंकि आप जानते हैं कि आप peek()
एक ही वस्तु लौटाते हैं, लेकिन map()
एक नज़र में यह भी स्पष्ट नहीं है कि यह वस्तु का एक ही वर्ग है।
इसके अलावा, peek()
आपके पास एक लैम्ब्डा हो सकता है जो उत्परिवर्तित करता है, लेकिन आपके साथ map()
एक ट्रेन मलबे का निर्माण करना होगा। की तुलना करें:
stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...)
stream.map(t -> {t.setLastProcessed(currentTimeMillis()); return t;}).forEach(...)
मुझे लगता है कि peek()
संस्करण स्पष्ट है, और लैम्ब्डा स्पष्ट रूप से उत्परिवर्तन कर रहा है, इसलिए कोई "रहस्यमय" साइड इफेक्ट नहीं है। इसी तरह, यदि एक विधि संदर्भ का उपयोग किया जाता है और विधि का नाम स्पष्ट रूप से उत्परिवर्तन उत्परिवर्तित होता है, तो वह भी स्पष्ट और स्पष्ट है।
एक व्यक्तिगत नोट पर, मैं peek()
म्यूट करने के लिए उपयोग करने से नहीं शर्माता - मुझे यह बहुत सुविधाजनक लगता है।
peek
एक धारा के साथ प्रयोग किया है जो अपने तत्वों को गतिशील रूप से उत्पन्न करता है? क्या यह अभी भी काम करता है, या परिवर्तन खो गए हैं? एक धारा के तत्वों को संशोधित करना मेरे लिए अविश्वसनीय लगता है।
List<Thing> list; things.stream().peek(list::add).forEach(...);
बहुत ही आसान। हाल ही में। मैंने प्रकाशन के लिए जानकारी जोड़ने के लिए इसका उपयोग किया है Map<Thing, Long> timestamps = ...; return things.stream().peek(t -> t.setTimestamp(timestamp.get(t))).collect(toList());
:। मुझे पता है कि इस उदाहरण को करने के अन्य तरीके हैं, लेकिन मैं यहां बहुत अधिक सरल हूं। peek()
अधिक कॉम्पैक्ट, और अधिक सुरुचिपूर्ण कोड IMHO का उपयोग करके । पठनीयता एक तरफ, यह सवाल वास्तव में है कि आपने क्या उठाया है; क्या यह सुरक्षित / विश्वसनीय है?
peek
? स्टैकओवरफ्लो पर मेरा भी यही सवाल है और उम्मीद है कि आप इसे देख सकते हैं और अपनी प्रतिक्रिया दे सकते हैं। धन्यवाद। stackoverflow.com/questions/47356992/…